package io.delphiplatform.api.v3.rdb.entity.apple.music;

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.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_apple_music_chart_track", schema = ChartmetricPartner.APPLE)
@Getter
@Setter
public class AppleMusicChartTrackEntity implements DatePosition {

    @EmbeddedId
    private AppleMusicChartTrackId id;

    @Column(name = "apple_music_chart_id", nullable = false, updatable = false, insertable = false)
    private String appleMusicChartId;

    @Column(name = "apple_music_track_id")
    private String appleMusicTrackId;

    @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 = "apple_music_country_id")
    private String appleMusicCountryId;

    @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;

    @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_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)
    @JoinColumn(name = "apple_music_track_id", insertable = false, updatable = false)
    private AppleMusicTrackEntity track;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "apple_music_track_id", referencedColumnName = "apple_music_track_id", insertable = false, updatable = false),
        @JoinColumn(name = "apple_music_country_id", referencedColumnName = "apple_music_country_id", insertable = false, updatable = false)
    })
    private AppleMusicTrackLocalizedEntity localizedTrack;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "apple_music_chart_id", insertable = false, updatable = false)
    private AppleMusicChartEntity chart;

    @Embedded
    private AppleMusicChartDateKey chartDateKey;

    @Embedded
    private AppleMusicChartDateTrackKey chartDateTrackKey;
}
