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

import java.time.LocalDate;
import java.util.Collection;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import io.delphiplatform.api.v3.decibelrdb.entity.DecibelCampaignEntity;
import io.delphiplatform.api.v3.decibelrdb.entity.DecibelCampaignPlatformEntity;
import io.delphiplatform.api.v3.decibelrdb.entity.DecibelProjectEntity;
import io.delphiplatform.api.v3.rdb.entity.DspEntity;
import lombok.Getter;
import lombok.Setter;

import static io.delphiplatform.api.v3.constant.DecibelTableNames.DECIBEL_SCHEMA;
import static io.delphiplatform.api.v3.constant.DecibelTableNames.PROJECT_CAMPAIGNS;

@Getter
@Setter
@Entity(name = "ads_campaign")
public class AdsCampaignEntity {

    @Id
    private String campaignId;
    private String campaignName;
    private String objective;
    private LocalDate startDate;
    private LocalDate endDate;
    @OneToMany(mappedBy = "adsCampaign")
    private Collection<AdsAdSetEntity> adsAdSets;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "account_id", nullable = false)
    private AdsAccountEntity adsAccount;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dsp", nullable = false)
    private DspEntity dsp;
    @OneToMany(mappedBy = "campaignArtistLinksId.adsCampaign")
    private Collection<CampaignArtistLinksEntity> campaignArtistLinks;
    @OneToMany(mappedBy = "campaignProjectLinksId.adsCampaign")
    private Collection<CampaignProjectLinksEntity> campaignProjectLinks;

    @ManyToMany
    @JoinTable(
        name = PROJECT_CAMPAIGNS,
        schema = DECIBEL_SCHEMA,
        joinColumns = {@JoinColumn(name = "campaign_id")},
        inverseJoinColumns = {@JoinColumn(name = "project_id")}
    )
    private Set<DecibelProjectEntity> projects;

    @OneToMany
    @JoinColumn(name = "campaign_id")
    private Set<DecibelCampaignPlatformEntity> platforms;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "campaign_id")
    private DecibelCampaignEntity decibelCampaign;


}
