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

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import java.io.Serial;
import java.io.Serializable;
import java.time.Instant;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

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

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

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

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

    @Column(name = "capienza_max")
    private Integer capienzaMax;

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

    @Column(name = "foto_url")
    private String fotoUrl;

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

    @Column(name = "updated_at")
    private Instant updatedAt;

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

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

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

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

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

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

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

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

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

    public String getDescrizione() {
        return this.descrizione;
    }

    public Struttura descrizione(String descrizione) {
        this.setDescrizione(descrizione);
        return this;
    }

    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    public String getIndirizzo() {
        return this.indirizzo;
    }

    public Struttura indirizzo(String indirizzo) {
        this.setIndirizzo(indirizzo);
        return this;
    }

    public void setIndirizzo(String indirizzo) {
        this.indirizzo = indirizzo;
    }

    public Integer getCapienzaMax() {
        return this.capienzaMax;
    }

    public Struttura capienzaMax(Integer capienzaMax) {
        this.setCapienzaMax(capienzaMax);
        return this;
    }

    public void setCapienzaMax(Integer capienzaMax) {
        this.capienzaMax = capienzaMax;
    }

    public Boolean getAttiva() {
        return this.attiva;
    }

    public Struttura attiva(Boolean attiva) {
        this.setAttiva(attiva);
        return this;
    }

    public void setAttiva(Boolean attiva) {
        this.attiva = attiva;
    }

    public String getFotoUrl() {
        return this.fotoUrl;
    }

    public Struttura fotoUrl(String fotoUrl) {
        this.setFotoUrl(fotoUrl);
        return this;
    }

    public void setFotoUrl(String fotoUrl) {
        this.fotoUrl = fotoUrl;
    }

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

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

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

    public Instant getUpdatedAt() {
        return this.updatedAt;
    }

    public Struttura updatedAt(Instant updatedAt) {
        this.setUpdatedAt(updatedAt);
        return this;
    }

    public void setUpdatedAt(Instant updatedAt) {
        this.updatedAt = updatedAt;
    }

    public Set<Disponibilita> getDisponibilitas() {
        return this.disponibilitas;
    }

    public void setDisponibilitas(Set<Disponibilita> disponibilitas) {
        if (this.disponibilitas != null) {
            this.disponibilitas.forEach(i -> i.setStruttura(null));
        }
        if (disponibilitas != null) {
            disponibilitas.forEach(i -> i.setStruttura(this));
        }
        this.disponibilitas = disponibilitas;
    }

    public Struttura disponibilitas(Set<Disponibilita> disponibilitas) {
        this.setDisponibilitas(disponibilitas);
        return this;
    }

    public Struttura addDisponibilita(Disponibilita disponibilita) {
        this.disponibilitas.add(disponibilita);
        disponibilita.setStruttura(this);
        return this;
    }

    public Struttura removeDisponibilita(Disponibilita disponibilita) {
        this.disponibilitas.remove(disponibilita);
        disponibilita.setStruttura(null);
        return this;
    }

    public Set<ModelloLiberatoria> getModuliLiberatories() {
        return this.moduliLiberatories;
    }

    public void setModuliLiberatories(Set<ModelloLiberatoria> modelloLiberatorias) {
        if (this.moduliLiberatories != null) {
            this.moduliLiberatories.forEach(i -> i.setStruttura(null));
        }
        if (modelloLiberatorias != null) {
            modelloLiberatorias.forEach(i -> i.setStruttura(this));
        }
        this.moduliLiberatories = modelloLiberatorias;
    }

    public Struttura moduliLiberatories(Set<ModelloLiberatoria> modelloLiberatorias) {
        this.setModuliLiberatories(modelloLiberatorias);
        return this;
    }

    public Struttura addModuliLiberatorie(ModelloLiberatoria modelloLiberatoria) {
        this.moduliLiberatories.add(modelloLiberatoria);
        modelloLiberatoria.setStruttura(this);
        return this;
    }

    public Struttura removeModuliLiberatorie(ModelloLiberatoria modelloLiberatoria) {
        this.moduliLiberatories.remove(modelloLiberatoria);
        modelloLiberatoria.setStruttura(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 Struttura)) {
            return false;
        }
        return getId() != null && getId().equals(((Struttura) 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 "Struttura{" +
            "id=" + getId() +
            ", nome='" + getNome() + "'" +
            ", descrizione='" + getDescrizione() + "'" +
            ", indirizzo='" + getIndirizzo() + "'" +
            ", capienzaMax=" + getCapienzaMax() +
            ", attiva='" + getAttiva() + "'" +
            ", fotoUrl='" + getFotoUrl() + "'" +
            ", createdAt='" + getCreatedAt() + "'" +
            ", updatedAt='" + getUpdatedAt() + "'" +
            "}";
    }
}
