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

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import io.delphiplatform.api.v3.constant.ChartmetricPartner;
import io.delphiplatform.api.v3.model.spotify.SpotifyChartBreakdown;
import io.delphiplatform.api.v3.model.spotify.SpotifyChartType;
import io.delphiplatform.api.v3.rdb.entity.converter.SpotifyChartBreakdownAttributeConverter;
import io.delphiplatform.api.v3.rdb.entity.converter.SpotifyChartTypeAttributeConverter;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "dim_spotify_chart", schema = ChartmetricPartner.SPOTIFY)
@Getter
@Setter
@EqualsAndHashCode(of = "spotifyChartId")
public class SpotifyChartEntity {
    @Id
    @Column(name = "spotify_chart_id")
    private String spotifyChartId;

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

    @Column(name = "type")
    @Convert(converter = SpotifyChartTypeAttributeConverter.class)
    private SpotifyChartType type;

    @Column(name = "breakdown")
    @Convert(converter = SpotifyChartBreakdownAttributeConverter.class)
    private SpotifyChartBreakdown breakdown;

    @Transient
    public String getName() {
        return String.format("Spotify Top %s %s %s", breakdown.getVerbalValue(), type.getVerbalValue(),
            spotifyCountryId.toUpperCase());
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "spotify_country_id", insertable = false, updatable = false)
    private SpotifyMarketRankEntity marketRank;

    public Integer getTotalPositions() {
        return SpotifyChartType.VIRAL.equals(type) ? 50 : 200;
    }
}
