package it.sw.pa.comune.artegna.domain;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import it.sw.pa.comune.artegna.domain.enumeration.Ruolo;
import jakarta.persistence.*;
import jakarta.validation.constraints.*;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

/**
 * A UtenteApp.
 */
@Entity
@Table(name = "utente_app")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@SuppressWarnings("common-java:DuplicatedBlocks")
public class UtenteApp implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    @Column(name = "id")
    private Long id;

    @NotNull
    @Column(name = "username", nullable = false, unique = true)
    private String username;

    @NotNull
    @Column(name = "email", nullable = false)
    private String email;

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

    @NotNull
    @Enumerated(EnumType.STRING)
    @Column(name = "ruolo", nullable = false)
    private Ruolo ruolo;

    @NotNull
    @Column(name = "attivo", nullable = false)
    private Boolean attivo;

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

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

    @Column(name = "luogo_nascita")
    private String luogoNascita;

    @Column(name = "data_nascita")
    private String dataNascita;

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

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

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

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

    @Column(name = "telefono_soc")
    private String telefonoSoc;

    @Column(name = "email_soc")
    private String emailSoc;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(unique = true)
    private User internalUser;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "utente")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @JsonIgnoreProperties(value = { "utente", "modelloLiberatoria" }, allowSetters = true)
    private Set<Liberatoria> liberatories = new HashSet<>();

    // jhipster-needle-entity-add-field - JHipster will add fields here

    public Long getId() {
        return this.id;
    }

    public UtenteApp id(Long id) {
        this.setId(id);
        return this;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return this.username;
    }

    public UtenteApp username(String username) {
        this.setUsername(username);
        return this;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return this.email;
    }

    public UtenteApp email(String email) {
        this.setEmail(email);
        return this;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelefono() {
        return this.telefono;
    }

    public UtenteApp telefono(String telefono) {
        this.setTelefono(telefono);
        return this;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public Ruolo getRuolo() {
        return this.ruolo;
    }

    public UtenteApp ruolo(Ruolo ruolo) {
        this.setRuolo(ruolo);
        return this;
    }

    public void setRuolo(Ruolo ruolo) {
        this.ruolo = ruolo;
    }

    public Boolean getAttivo() {
        return this.attivo;
    }

    public UtenteApp attivo(Boolean attivo) {
        this.setAttivo(attivo);
        return this;
    }

    public void setAttivo(Boolean attivo) {
        this.attivo = attivo;
    }

    public String getNome() {
        return this.nome;
    }

    public UtenteApp nome(String nome) {
        this.setNome(nome);
        return this;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return this.cognome;
    }

    public UtenteApp cognome(String cognome) {
        this.setCognome(cognome);
        return this;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getLuogoNascita() {
        return this.luogoNascita;
    }

    public UtenteApp luogoNascita(String luogoNascita) {
        this.setLuogoNascita(luogoNascita);
        return this;
    }

    public void setLuogoNascita(String luogoNascita) {
        this.luogoNascita = luogoNascita;
    }

    public String getDataNascita() {
        return this.dataNascita;
    }

    public UtenteApp dataNascita(String dataNascita) {
        this.setDataNascita(dataNascita);
        return this;
    }

    public void setDataNascita(String dataNascita) {
        this.dataNascita = dataNascita;
    }

    public String getResidente() {
        return this.residente;
    }

    public UtenteApp residente(String residente) {
        this.setResidente(residente);
        return this;
    }

    public void setResidente(String residente) {
        this.residente = residente;
    }

    public String getSocieta() {
        return this.societa;
    }

    public UtenteApp societa(String societa) {
        this.setSocieta(societa);
        return this;
    }

    public void setSocieta(String societa) {
        this.societa = societa;
    }

    public String getSede() {
        return this.sede;
    }

    public UtenteApp sede(String sede) {
        this.setSede(sede);
        return this;
    }

    public void setSede(String sede) {
        this.sede = sede;
    }

    public String getCodfiscale() {
        return this.codfiscale;
    }

    public UtenteApp codfiscale(String codfiscale) {
        this.setCodfiscale(codfiscale);
        return this;
    }

    public void setCodfiscale(String codfiscale) {
        this.codfiscale = codfiscale;
    }

    public String getTelefonoSoc() {
        return this.telefonoSoc;
    }

    public UtenteApp telefonoSoc(String telefonoSoc) {
        this.setTelefonoSoc(telefonoSoc);
        return this;
    }

    public void setTelefonoSoc(String telefonoSoc) {
        this.telefonoSoc = telefonoSoc;
    }

    public String getEmailSoc() {
        return this.emailSoc;
    }

    public UtenteApp emailSoc(String emailSoc) {
        this.setEmailSoc(emailSoc);
        return this;
    }

    public void setEmailSoc(String emailSoc) {
        this.emailSoc = emailSoc;
    }

    public User getInternalUser() {
        return this.internalUser;
    }

    public void setInternalUser(User user) {
        this.internalUser = user;
    }

    public UtenteApp internalUser(User user) {
        this.setInternalUser(user);
        return this;
    }

    public Set<Liberatoria> getLiberatories() {
        return this.liberatories;
    }

    public void setLiberatories(Set<Liberatoria> liberatorias) {
        if (this.liberatories != null) {
            this.liberatories.forEach(i -> i.setUtente(null));
        }
        if (liberatorias != null) {
            liberatorias.forEach(i -> i.setUtente(this));
        }
        this.liberatories = liberatorias;
    }

    public UtenteApp liberatories(Set<Liberatoria> liberatorias) {
        this.setLiberatories(liberatorias);
        return this;
    }

    public UtenteApp addLiberatorie(Liberatoria liberatoria) {
        this.liberatories.add(liberatoria);
        liberatoria.setUtente(this);
        return this;
    }

    public UtenteApp removeLiberatorie(Liberatoria liberatoria) {
        this.liberatories.remove(liberatoria);
        liberatoria.setUtente(null);
        return this;
    }

    // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof UtenteApp)) {
            return false;
        }
        return getId() != null && getId().equals(((UtenteApp) o).getId());
    }

    @Override
    public int hashCode() {
        // see https://vladmihalcea.com/how-to-implement-equals-and-hashcode-using-the-jpa-entity-identifier/
        return getClass().hashCode();
    }

    // prettier-ignore
    @Override
    public String toString() {
        return "UtenteApp{" +
            "id=" + getId() +
            ", username='" + getUsername() + "'" +
            ", email='" + getEmail() + "'" +
            ", telefono='" + getTelefono() + "'" +
            ", ruolo='" + getRuolo() + "'" +
            ", attivo='" + getAttivo() + "'" +
            ", nome='" + getNome() + "'" +
            ", cognome='" + getCognome() + "'" +
            ", luogoNascita='" + getLuogoNascita() + "'" +
            ", dataNascita='" + getDataNascita() + "'" +
            ", residente='" + getResidente() + "'" +
            ", societa='" + getSocieta() + "'" +
            ", sede='" + getSede() + "'" +
            ", codfiscale='" + getCodfiscale() + "'" +
            ", telefonoSoc='" + getTelefonoSoc() + "'" +
            ", emailSoc='" + getEmailSoc() + "'" +
            "}";
    }
}
