package io.delphiplatform.api.v3.model.datahealth;

import com.fasterxml.jackson.annotation.JsonProperty;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.openapitools.jackson.nullable.JsonNullable;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;

import java.time.LocalDate;

import javax.validation.Valid;

/**
 * Optionally included object that contains overall metrics for a Chart entity. Data is at the chart_id level.
 */
public class DataHealthChartPosition {

    @JsonProperty("chart_group")
    private String chartGroup;

    @JsonProperty("dsp")
    private String dsp;
    @JsonProperty("earliest_data_date")
    @DateTimeFormat(iso = ISO.DATE)
    private JsonNullable<LocalDate> earliestDataDate = JsonNullable.undefined();
    @JsonProperty("latest_data_date")
    @DateTimeFormat(iso = ISO.DATE)
    private JsonNullable<LocalDate> latestDataDate = JsonNullable.undefined();

    public DataHealthChartPosition() {
    }

    public DataHealthChartPosition(String chartGroup, String dsp,
        LocalDate earliestDataDate,
        LocalDate latestDataDate) {
        this.chartGroup = chartGroup;
        this.dsp = dsp;
        this.earliestDataDate = JsonNullable.of(earliestDataDate);
        this.latestDataDate = JsonNullable.of(latestDataDate);
    }

    public DataHealthChartPosition chartGroup(String chartGroup) {
        this.chartGroup = chartGroup;
        return this;
    }

    /**
     * Portion of chart primary key describing a general group the chart may belong to
     *
     * @return chartGroup
     */
    public String getChartGroup() {
        return chartGroup;
    }

    public void setChartGroup(String chartGroup) {
        this.chartGroup = chartGroup;
    }

    public DataHealthChartPosition dsp(String dsp) {
        this.dsp = dsp;
        return this;
    }

    /**
     * The slug name of a DSP. This is a lowercase value that is the same as the `dsp_id`.
     *
     * @return dsp
     */
    public String getDsp() {
        return dsp;
    }

    public void setDsp(String dsp) {
        this.dsp = dsp;
    }

    public DataHealthChartPosition earliestDataDate(LocalDate earliestDataDate) {
        this.earliestDataDate = JsonNullable.of(earliestDataDate);
        return this;
    }

    /**
     * The earliest date that contains any positions data for a Chart or Playlist. This metric is based on data.
     *
     * @return earliestDataDate
     */
    @Valid
    public JsonNullable<LocalDate> getEarliestDataDate() {
        return earliestDataDate;
    }

    public void setEarliestDataDate(JsonNullable<LocalDate> earliestDataDate) {
        this.earliestDataDate = earliestDataDate;
    }

    public DataHealthChartPosition latestDataDate(LocalDate latestDataDate) {
        this.latestDataDate = JsonNullable.of(latestDataDate);
        return this;
    }

    /**
     * The latest date that contains any positions data for a Chart or Playlist. This metric is based on data.
     *
     * @return latestDataDate
     */
    @Valid
    public JsonNullable<LocalDate> getLatestDataDate() {
        return latestDataDate;
    }

    public void setLatestDataDate(JsonNullable<LocalDate> latestDataDate) {
        this.latestDataDate = latestDataDate;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
            .append("chartGroup", chartGroup)
            .append("dsp", dsp)
            .append("earliestDataDate", earliestDataDate)
            .append("latestDataDate", latestDataDate)
            .toString();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }

        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        DataHealthChartPosition that = (DataHealthChartPosition) o;

        return new EqualsBuilder().append(chartGroup, that.chartGroup)
            .append(dsp, that.dsp).append(earliestDataDate, that.earliestDataDate)
            .append(latestDataDate, that.latestDataDate).isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37).append(chartGroup).append(dsp).append(earliestDataDate)
            .append(latestDataDate)
            .toHashCode();
    }

}

