package io.delphiplatform.api.v3.model;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.util.Objects;

import javax.validation.constraints.Pattern;

import io.delphiplatform.api.v3.constant.ApplicationConstants;

/**
 * StreamDate
 */
@JsonPropertyOrder(alphabetic = true)
public class StreamDate {

    @JsonProperty("date")
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    private LocalDate date;

    @JsonProperty("dsp")
    private String dsp;

    @JsonProperty("country_code")
    private String countryCode;

    @JsonProperty("isrc")
    private String isrc;

    @JsonProperty("streams")
    private Long streams;

    public StreamDate date(LocalDate date) {
        this.date = date;
        return this;
    }

    public LocalDate getDate() {
        return date;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }

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

    public String getDsp() {
        return dsp;
    }

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

    public StreamDate countryCode(String countryCode) {
        this.countryCode = countryCode;
        return this;
    }

    public String getCountryCode() {
        return countryCode;
    }

    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }

    public StreamDate isrc(String isrc) {
        this.isrc = isrc;
        return this;
    }

    @Pattern(regexp = ApplicationConstants.ISRC_PATTERN)
    public String getIsrc() {
        return isrc;
    }

    public void setIsrc(String isrc) {
        this.isrc = isrc;
    }

    public StreamDate streams(Long streams) {
        this.streams = streams;
        return this;
    }

    public Long getStreams() {
        return streams;
    }

    public void setStreams(Long streams) {
        this.streams = streams;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        StreamDate streamDate = (StreamDate) o;
        return Objects.equals(this.date, streamDate.date) &&
            Objects.equals(this.dsp, streamDate.dsp) &&
            Objects.equals(this.countryCode, streamDate.countryCode) &&
            Objects.equals(this.isrc, streamDate.isrc) &&
            Objects.equals(this.streams, streamDate.streams);
    }

    @Override
    public int hashCode() {
        return Objects.hash(date, dsp, countryCode, isrc, streams);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("class StreamDate {\n");

        sb.append("    date: ").append(toIndentedString(date)).append("\n");
        sb.append("    dsp: ").append(toIndentedString(dsp)).append("\n");
        sb.append("    countryCode: ").append(toIndentedString(countryCode)).append("\n");
        sb.append("    isrc: ").append(toIndentedString(isrc)).append("\n");
        sb.append("    streams: ").append(toIndentedString(streams)).append("\n");
        sb.append("}");
        return sb.toString();
    }

    /**
     * Convert the given object to string with each line indented by 4 spaces (except the first line).
     */
    private String toIndentedString(Object o) {
        if (o == null) {
            return "null";
        }
        return o.toString().replace("\n", "\n    ");
    }
}

