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

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import it.sw.pa.comune.artegna.domain.enumeration.TipoCanaleNotifica;
import it.sw.pa.comune.artegna.domain.enumeration.TipoEventoNotifica;
import jakarta.persistence.*;
import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

/**
 * A Notifica.
 */
@Entity
@Table(name = "notifica")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@SuppressWarnings("common-java:DuplicatedBlocks")
public class Notifica 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;

    @Enumerated(EnumType.STRING)
    @Column(name = "tipo_canale")
    private TipoCanaleNotifica tipoCanale;

    @Enumerated(EnumType.STRING)
    @Column(name = "tipo_evento")
    private TipoEventoNotifica tipoEvento;

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

    @Column(name = "inviata")
    private Boolean inviata;

    @Column(name = "inviata_at")
    private Instant inviataAt;

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

    @Column(name = "created_at")
    private Instant createdAt;

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnoreProperties(value = { "confermataDa", "prenotazione" }, allowSetters = true)
    private Conferma conferma;

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

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

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

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

    public TipoCanaleNotifica getTipoCanale() {
        return this.tipoCanale;
    }

    public Notifica tipoCanale(TipoCanaleNotifica tipoCanale) {
        this.setTipoCanale(tipoCanale);
        return this;
    }

    public void setTipoCanale(TipoCanaleNotifica tipoCanale) {
        this.tipoCanale = tipoCanale;
    }

    public TipoEventoNotifica getTipoEvento() {
        return this.tipoEvento;
    }

    public Notifica tipoEvento(TipoEventoNotifica tipoEvento) {
        this.setTipoEvento(tipoEvento);
        return this;
    }

    public void setTipoEvento(TipoEventoNotifica tipoEvento) {
        this.tipoEvento = tipoEvento;
    }

    public String getMessaggio() {
        return this.messaggio;
    }

    public Notifica messaggio(String messaggio) {
        this.setMessaggio(messaggio);
        return this;
    }

    public void setMessaggio(String messaggio) {
        this.messaggio = messaggio;
    }

    public Boolean getInviata() {
        return this.inviata;
    }

    public Notifica inviata(Boolean inviata) {
        this.setInviata(inviata);
        return this;
    }

    public void setInviata(Boolean inviata) {
        this.inviata = inviata;
    }

    public Instant getInviataAt() {
        return this.inviataAt;
    }

    public Notifica inviataAt(Instant inviataAt) {
        this.setInviataAt(inviataAt);
        return this;
    }

    public void setInviataAt(Instant inviataAt) {
        this.inviataAt = inviataAt;
    }

    public String getErrore() {
        return this.errore;
    }

    public Notifica errore(String errore) {
        this.setErrore(errore);
        return this;
    }

    public void setErrore(String errore) {
        this.errore = errore;
    }

    public Instant getCreatedAt() {
        return this.createdAt;
    }

    public Notifica createdAt(Instant createdAt) {
        this.setCreatedAt(createdAt);
        return this;
    }

    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt;
    }

    public Conferma getConferma() {
        return this.conferma;
    }

    public void setConferma(Conferma conferma) {
        this.conferma = conferma;
    }

    public Notifica conferma(Conferma conferma) {
        this.setConferma(conferma);
        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 Notifica)) {
            return false;
        }
        return getId() != null && getId().equals(((Notifica) 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 "Notifica{" +
            "id=" + getId() +
            ", tipoCanale='" + getTipoCanale() + "'" +
            ", tipoEvento='" + getTipoEvento() + "'" +
            ", messaggio='" + getMessaggio() + "'" +
            ", inviata='" + getInviata() + "'" +
            ", inviataAt='" + getInviataAt() + "'" +
            ", errore='" + getErrore() + "'" +
            ", createdAt='" + getCreatedAt() + "'" +
            "}";
    }
}
