package io.delphiplatform.api.v3.rdb.entity.spotify;

import org.hibernate.annotations.Formula;

import java.time.LocalDate;
import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import io.delphiplatform.api.v3.constant.ChartmetricPartner;
import io.delphiplatform.api.v3.model.charts.DatePosition;
import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "fact_spotify_chart_track", schema = ChartmetricPartner.SPOTIFY)
@Getter
@Setter
public class SpotifyChartTrackEntity implements DatePosition {

    @EmbeddedId
    private SpotifyChartTrackId id;

    @Column(name = "spotify_chart_id", nullable = false, updatable = false, insertable = false)
    private String spotifyChartId;

    @Column(name = "spotify_track_id")
    private String spotifyTrackId;

    @Column(name = "spotify_country_id")
    private String spotifyCountryId;

    @Column(name = "chart_date", nullable = false, updatable = false, insertable = false)
    private LocalDate chartDate;

    @Column(name = "current_position", nullable = false, updatable = false, insertable = false)
    private Integer currentPosition;

    @Column(name = "is_exit")
    private boolean isExit;

    @Column(name = "is_entry")
    private boolean isEntry;

    @Column(name = "is_reentry")
    private boolean isReentry;

    @Column(name = "prev_chart_date")
    private LocalDate prevChartDate;

    @Column(name = "prev_position")
    private Integer prevPosition;

    @Column(name = "off_chart_days")
    private Integer offChartDays;

    @Column(name = "on_chart_days")
    private Integer onChartDays;

    @Column(name = "period_streams")
    private Integer periodStreams;

    @Formula("(prev_position - current_position)")
    private Integer trend;

    @Column(name = "isrc")
    private String isrc;

    @Column(name = "isrc_current_position")
    private Integer isrcCurrentPosition;

    @Column(name = "isrc_is_exit")
    private Boolean isrcIsExit;

    @Column(name = "isrc_is_entry")
    private Boolean isrcIsEntry;

    @Column(name = "isrc_is_reentry")
    private Boolean isrcIsReentry;

    @Column(name = "isrc_period_streams")
    private Integer isrcPeriodStreams;

    @Column(name = "isrc_prev_chart_date")
    private LocalDate isrcPrevChartDate;

    @Column(name = "isrc_prev_position")
    private Integer isrcPrevPosition;

    @Column(name = "isrc_off_chart_days")
    private Integer isrcOffChartDays;

    @Column(name = "isrc_on_chart_days")
    private Integer isrcOnChartDays;

    @Formula("(isrc_prev_position - isrc_current_position)")
    private Integer isrcTrend;

    @Column(name = "created_at")
    private LocalDateTime createdAt;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "spotify_track_id", referencedColumnName = "spotify_track_id", insertable = false, updatable = false),
        @JoinColumn(name = "spotify_country_id", referencedColumnName = "spotify_country_id", insertable = false, updatable = false)
    })
    private SpotifyTrackEntity track;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "spotify_chart_id", insertable = false, updatable = false)
    private SpotifyChartEntity chart;

    @Embedded
    private SpotifyChartDateKey chartDateKey;

    @Embedded
    private SpotifyChartDateTrackKey chartDateTrackKey;
}
