package io.delphiplatform.api.v3.model;

import com.fasterxml.jackson.annotation.JsonProperty;

import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;

import javax.validation.Valid;
import javax.validation.constraints.Pattern;

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

/**
 * PlaylistTrackPosition
 */
public abstract class TrackPosition {

    @JsonProperty("isrc")
    protected String isrc;

    @JsonProperty("dsp")
    protected String dsp;

    @JsonProperty("current")
    protected Long current;

    @JsonProperty("previous")
    protected Long previous;

    @JsonProperty("top")
    protected Integer top;

    @JsonProperty("num_weeks_on")
    protected Integer numWeeksOn;

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

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

    /**
     * The International Standard Recording Code (ISRC) for a song.
     *
     * @return isrc
     */
    @Pattern(regexp = ApplicationConstants.ISRC_PATTERN)
    public String getIsrc() {
        return isrc;
    }

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

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

    /**
     * Slug name of a DSP
     *
     * @return dsp
     */
    @Pattern(regexp = "^[a-z]*$")
    public String getDsp() {
        return dsp;
    }

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

    public TrackPosition current(Long current) {
        this.current = current;
        return this;
    }

    /**
     * Get current
     *
     * @return current
     */
    public Long getCurrent() {
        return current;
    }

    public void setCurrent(Long current) {
        this.current = current;
    }

    public TrackPosition previous(Long previous) {
        this.previous = previous;
        return this;
    }

    /**
     * Get previous
     *
     * @return previous
     */
    public Long getPrevious() {
        return previous;
    }

    public void setPrevious(Long previous) {
        this.previous = previous;
    }

    public TrackPosition top(Integer top) {
        this.top = top;
        return this;
    }

    /**
     * Get top
     *
     * @return top
     */
    public Integer getTop() {
        return top;
    }

    public void setTop(Integer top) {
        this.top = top;
    }

    public TrackPosition numWeeksOn(Integer numWeeksOn) {
        this.numWeeksOn = numWeeksOn;
        return this;
    }

    /**
     * Get numWeeksOn
     *
     * @return numWeeksOn
     */
    public Integer getNumWeeksOn() {
        return numWeeksOn;
    }

    public void setNumWeeksOn(Integer numWeeksOn) {
        this.numWeeksOn = numWeeksOn;
    }

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

    /**
     * ISO 8601 date in format `YYYY-MM-DD`
     *
     * @return date
     */
    @Valid
    @Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$")
    public LocalDate getDate() {
        return date;
    }

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

}
