package com.fasterxml.jackson.failing;

import com.fasterxml.jackson.annotation.*;

import com.fasterxml.jackson.databind.*;

public class KevinFail1410Test extends BaseMapTest
{
    enum EnvironmentEventSource { BACKEND; }
    
    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="source")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = BackendEvent.class, name = "BACKEND")
    })
    static abstract class EnvironmentEvent {
        private String environmentName;
        private String message;

        protected EnvironmentEvent() { } // for deserializer
        protected EnvironmentEvent(String env, String msg) {
            environmentName = env;
            message = msg;
        }
        public String getEnvironmentName() { return environmentName; }
        public abstract EnvironmentEventSource getSource();
        public String getMessage() { return message; }
    }

    static class BackendEvent extends EnvironmentEvent {
        private String status;

        private Object resultData;

        protected BackendEvent() {} // for deserializer

        public BackendEvent(String envName, String message, String status, Object results)
        {
            super(envName, message);
            this.status = status;
            resultData = results;
        }

        public static BackendEvent create(String environmentName, String message,
                String status, Object results)
        {
            return new BackendEvent(environmentName, message,
                    status, results);
        }

        @Override
        public EnvironmentEventSource getSource() {
            return EnvironmentEventSource.BACKEND;
        }

        public String getStatus() {
            return status;
        }

        public Object getResultData() {
            return resultData;
        }

        @Override
        public String toString() {
            return String.format("(%s): %s", status, getMessage());
        }
    }

    public void testDupProps() throws Exception
    {
        ObjectMapper mapper = new ObjectMapper();
        EnvironmentEvent event = new BackendEvent("foo", "hello", "bar", null);
        String ser = mapper
                .writerWithDefaultPrettyPrinter()
                .writeValueAsString(event);
        mapper.readValue(ser, EnvironmentEvent.class);
        assertNotNull(ser);
    }
}
