package org.apache.kafka.connect.utils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.kafka.connect.data.Date;
import org.apache.kafka.connect.data.Field;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.Struct;
import org.apache.kafka.connect.data.Time;
import org.apache.kafka.connect.data.Timestamp;

/**
 * @author Andrea Patelli
 */
public class SchemaUtils {
    public static Map<String, Object> toJsonMap(Struct struct) {
        Map<String, Object> jsonMap = new HashMap<String, Object>(0);
        List<Field> fields = struct.schema().fields();
        for (Field field : fields) {
            String fieldName = field.name();
            Schema.Type fieldType = field.schema().type();
            String schemaName=field.schema().name();
            switch (fieldType) {
                case STRING:
                    jsonMap.put(fieldName, struct.getString(fieldName));
                    break;
                case INT32:
                	if (Date.LOGICAL_NAME.equals(schemaName) 
                			|| Time.LOGICAL_NAME.equals(schemaName)) {
                		jsonMap.put(fieldName, (java.util.Date) struct.get(fieldName));
                	} else {
                		jsonMap.put(fieldName, struct.getInt32(fieldName));
                	}
                    break;
                case INT16:
                    jsonMap.put(fieldName, struct.getInt16(fieldName));
                    break;
                case INT64:
                	if (Timestamp.LOGICAL_NAME.equals(schemaName)) {
                		jsonMap.put(fieldName, (java.util.Date) struct.get(fieldName));
                	} else {
                		jsonMap.put(fieldName, struct.getInt64(fieldName));
                	}
                    break;
                case FLOAT32:
                    jsonMap.put(fieldName, struct.getFloat32(fieldName));
                    break;
                case STRUCT:
                    jsonMap.put(fieldName, toJsonMap(struct.getStruct(fieldName)));
                    break;
            }
        }
        return jsonMap;
    }
}