package com.box.sdk;

import java.util.Date;

import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;

/**
 * Represents a watermark.
 * Watermarks are used to protect sensitive information in the Box account.
 *
 * @see <a href="https://docs.box.com/reference#watermarking">Watermarking</a>
 */
public class BoxWatermark extends BoxJSONObject {

    /**
     * Default imprint for watermarks.
     */
    public static final String WATERMARK_DEFAULT_IMPRINT = "default";

    /**
     * Json key for watermark.
     * @see BoxWatermark#parseJSONMember(JsonObject.Member)
     */
    public static final String WATERMARK_JSON_KEY = "watermark";

    /**
     * Json key for created_at param.
     * @see BoxWatermark#parseJSONMember(JsonObject.Member)
     */
    public static final String CREATED_AT_JSON_KEY = "created_at";

    /**
     * Json key for modified_at param.
     * @see BoxWatermark#parseJSONMember(JsonObject.Member)
     */
    public static final String MODIFIED_AT_JSON_KEY = "modified_at";

    /**
     * Json key for watermark param.
     */
    public static final String WATERMARK_IMPRINT_JSON_KEY = "imprint";

    /**
     * @see #getCreatedAt()
     */
    private Date createdAt;

    /**
     * @see #getModifiedAt()
     */
    private Date modifiedAt;

    /**
     * Constructs an empty watermark object.
     */
    public BoxWatermark() {
        super();
    }

    /**
     * Constructs a watermark object by parsing information from a JSON string.
     * @param  json the JSON string to parse.
     */
    public BoxWatermark(String json) {
        super(json);
    }

    /**
     * Constructs a watermark object using an already parsed JSON object.
     * @param  jsonObject the parsed JSON object.
     */
    BoxWatermark(JsonObject jsonObject) {
        super(jsonObject);
    }

    /**
     * @return the time that the watermark was created.
     */
    public Date getCreatedAt() {
        return this.createdAt;
    }

    /**
     * @return the time that the watermark was last modified.
     */
    public Date getModifiedAt() {
        return this.modifiedAt;
    }

    /**
     * {@inheritDoc}
     */
    public BoxWatermark getResource() {
        return BoxWatermark.this;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    void parseJSONMember(JsonObject.Member member) {
        super.parseJSONMember(member);
        String memberName = member.getName();
        JsonValue value = member.getValue();
        if (memberName.equals(WATERMARK_JSON_KEY)) {
            try {
                this.createdAt = BoxDateFormat.parse(value.asObject().get(CREATED_AT_JSON_KEY).asString());
                this.modifiedAt = BoxDateFormat.parse(value.asObject().get(MODIFIED_AT_JSON_KEY).asString());
            } catch (Exception e) {
                throw new BoxDeserializationException(memberName, value.toString(), e);
            }
        }
    }

}