/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.hcatalog.templeton;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.hcatalog.templeton.tool.TempletonUtils;
import org.codehaus.jackson.map.ObjectMapper;

/**
 * Helper class to build new json objects with new top level
 * properties.  Only add non-null entries.
 */
public class JsonBuilder {
    static final int OK = 200;
    static final int MISSING = 404;
    static final int SERVER_ERROR = 500;

    // The map we're building.
    private Map map;

    // Parse the json map.
    private JsonBuilder(String json)
        throws IOException
    {
        map = jsonToMap(json);
    }

    /**
     * Create a new map object from the existing json.
     */
    public static JsonBuilder create(String json)
        throws IOException
    {
        return new JsonBuilder(json);
    }

    /**
     * Create a new map object.
     */
    public static JsonBuilder create()
        throws IOException
    {
        return new JsonBuilder(null);
    }

    /**
     * Create a new map error object.
     */
    public static JsonBuilder createError(String msg, int code)
        throws IOException
    {
        return new JsonBuilder(null)
            .put("error", msg)
            .put("errorCode", code);
    }

    /**
     * Add a non-null value to the map.
     */
    public JsonBuilder put(String name, Object val) {
        if (val != null)
            map.put(name, val);
        return this;
    }

    /**
     * Remove a value from the map.
     */
    public JsonBuilder remove(String name) {
        map.remove(name);
        return this;
    }

    /**
     * Get the underlying map.
     */
    public Map getMap() {
        return map;
    }

    /**
     * Turn the map back to response object.
     */
    public Response build() {
        return buildResponse();
    }

    /**
     * Turn the map back to json.
     */
    public String buildJson()
        throws IOException
    {
        return mapToJson(map);
    }

    /**
     * Turn the map back to response object.
     */
    public Response buildResponse() {
        int status = OK;        // Server ok.
        if (map.containsKey("error"))
            status = SERVER_ERROR; // Generic http server error.
        Object o = map.get("errorCode");
        if (o != null) {
            try {
                status = Integer.parseInt(o.toString());
            } catch (Exception e) {
                if (o instanceof Number)
                    status = ((Number) o).intValue();
            }
        }
        return buildResponse(status);
    }

    /**
     * Turn the map back to response object.
     */
    public Response buildResponse(int status) {
        return Response.status(status)
            .entity(map)
            .type(MediaType.APPLICATION_JSON)
            .build();
    }

    /**
     * Is the object non-empty?
     */
    public boolean isset() {
        return TempletonUtils.isset(map);
    }

    /**
     * Check if this is an error doc.
     */
    public static boolean isError(Map obj)
    {
        return (obj != null) && obj.containsKey("error");
    }

    /**
     * Convert a json string to a Map.
     */
    public static Map jsonToMap(String json)
        throws IOException
    {
        if (! TempletonUtils.isset(json))
            return new HashMap<String, Object>();
        else {
            ObjectMapper mapper = new ObjectMapper();
            return mapper.readValue(json, Map.class);
        }
    }

    /**
     * Convert a map to a json string.
     */
    public static String mapToJson(Object obj)
        throws IOException
    {
        ObjectMapper mapper = new ObjectMapper();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        mapper.writeValue(out, obj);
        return out.toString();
    }
}
