package com.hpay.hpay_mobile_api.entities;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import java.util.Date;
import java.util.List;
import java.util.Set;

@Entity
@Table(name = "clients")
@RequiredArgsConstructor
@Getter
@Setter
public class Client {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idclients")
    private Long id;

    @Column(name = "client_code", nullable = false, length = 10)
    private String clientCode;

    @Column(name = "nom", length = 45)
    private String nom;

    @Column(name = "prenoms", length = 45)
    private String prenoms;

    @Column(name = "sexe", length = 1)
    private String sexe;

    @Column(name = "date_naissance")
    private Date dateNaissance;

    @Column(name = "lieu_naissane", length = 45)
    private String lieuNaissane;

    @Column(name = "telephone", length = 45)
    private String telephone;

    @Column(name = "telephone2", length = 45)

    private String telephone2;

    @Column(name = "adresse", length = 45)
    private String adresse;

    @Column(name = "email", length = 128)
    private String email;

    @Column(name = "quartier", length = 45)
    private String quartier;

    @Column(name = "nationalite", length = 45)
    private String nationalite;

    @Column(name = "photo_client", length = 45)
    private String photoClient;

    @Column(name = "num_piece", nullable = false, length = 45)
    private String numPiece;

    @Column(name = "expire_piece")
    private Date expirePiece;

    @Column(name = "photo_piece_recto", length = 512)
    private String photoPieceRecto;

    @Column(name = "photo_piece_verso", length = 512)
    private String photoPieceVerso;

    @Column(name = "signature", length = 45)
    private String signature;

    @Column(name = "date_inscrit", nullable = false)
    private Date dateInscrit;

    @ManyToOne
    @JoinColumn(name = "idville", nullable = false)
    private Ville ville;

    @Column(name = "idtype_piece", nullable = false)
    private Integer idTypePiece;

    @ManyToOne
    @JoinColumn(name = "idpays", nullable = false)
    private Pays pays;

    @Column(name = "idagence", nullable = false)
    private Integer idAgence;

    @Column(name = "matricule", length = 15)
    private String matricule;

    @Column(name = "valider", nullable = false, length = 1)
    private String valider;

    @Column(name = "piece_cni")
    private Integer pieceCni;

    @Column(name = "num_piece_cni", length = 25)
    private String numPieceCni;

    @Column(name = "date_expire_cni", length = 20)
    private String dateExpireCni;

    @Column(name = "piece_passport")
    private Integer piecePassport;

    @Column(name = "num_piece_passport", length = 20)
    private String numPiecePassport;

    @Column(name = "date_expire_passport", length = 20)
    private String dateExpirePassport;

    @Column(name = "piece_carte")
    private Integer pieceCarte;

    @Column(name = "num_piece_carte", length = 20)
    private String numPieceCarte;

    @Column(name = "date_expire_carte", length = 20)
    private String dateExpireCarte;

    @Column(name = "idgestionnaire", nullable = false)
    private Integer idGestionnaire;

    @Column(name = "idcommercial", nullable = false)
    private Integer idCommercial;

    @Column(name = "gain_commercial", nullable = false)
    private Float gainCommercial;

    @Column(name = "gain_paye", nullable = false, length = 1)
    private String gainPaye;

    @Column(name = "gain_date_paye")
    private Date gainDatePaye;

    @Column(name = "fcm_token")
    private String fcmToken;


    @OneToMany(mappedBy = "client")
    @JsonManagedReference
    private List<Compte> comptes;

    // One-to-many relationship for parrain (referrer)
    @OneToMany(mappedBy = "parrain")
    @JsonBackReference
    private List<Parrainage> parrains;

    // One-to-many relationship for parrainee (referred)
    @OneToMany(mappedBy = "parrainee")
    @JsonBackReference
    private List<Parrainage> parrainees;


    // One-to-One relationship with LoginClient
    @OneToOne(mappedBy = "client", cascade = CascadeType.ALL)
    @JsonBackReference
    private LoginClient loginClient;


    @OneToMany(mappedBy = "client")
    @JsonBackReference
    private Set<Beneficiaire> beneficiaires;


    @OneToOne(mappedBy = "client")
    @JsonManagedReference
    private ParrainCode parrainCode;


    public Client(String clientCode,
                  String numPiece,
                  Date dateInscrit,
                  Ville ville,
                  Integer idTypePiece,
                  Pays pays,
                  Integer idAgence,
                  String valider,
                  Float gainCommercial,
                  String gainPaye,
                  Integer  idCommercial,
                  Integer idGestionnaire,
                  String telephone
    ) {
        this.clientCode = clientCode;
        this.numPiece = numPiece;
        this.dateInscrit = dateInscrit;
        this.ville = ville;
        this.idTypePiece = idTypePiece;
        this.pays = pays;
        this.idAgence = idAgence;
        this.valider = valider;
        this.gainCommercial = gainCommercial;
        this.gainPaye = gainPaye;
        this.idCommercial = idCommercial;
        this.idGestionnaire = idGestionnaire;
       // this.parrainCode = parrainCode;
        this.telephone= telephone;
    }

}