package org.texttechnologylab.project.gruppe_05_1.domain.speaker;

import java.time.LocalDate;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;

public abstract class Speaker {
    String      id;
    String      name;
    String      firstName;
    String      title;
    LocalDate   geburtsdatum;           // in Mongo eigentlich LocalDateTime, ziemlich sinnlos
    String      geburtsort;
    LocalDate   sterbedatum;           // in Mongo eigentlich LocalDateTime, ziemlich sinnlos
    String      geschlecht;
    String      beruf;
    String      akademischertitel;
    String      familienstand;
    String      religion;
    String      vita;
    String      party;
    String      primaryFoto;
    List<Membership> memberships;

    // TODO: List<Speech> speeches;

    // TODO: Photos

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public LocalDate getGeburtsdatum() {
        return geburtsdatum;
    }

    public void setGeburtsdatum(LocalDate geburtsdatum) {
        this.geburtsdatum = geburtsdatum;
    }

    public String getGeburtsort() {
        return geburtsort;
    }

    public void setGeburtsort(String geburtsort) {
        this.geburtsort = geburtsort;
    }

    public LocalDate getSterbedatum() {
        return sterbedatum;
    }

    public void setSterbedatum(LocalDate sterbedatum) {
        this.sterbedatum = sterbedatum;
    }

    public String getGeschlecht() {
        return geschlecht;
    }

    public void setGeschlecht(String geschlecht) {
        this.geschlecht = geschlecht;
    }

    public String getBeruf() {
        return beruf;
    }

    public void setBeruf(String beruf) {
        this.beruf = beruf;
    }

    public String getAkademischertitel() {
        return akademischertitel;
    }

    public void setAkademischertitel(String akademischertitel) {
        this.akademischertitel = akademischertitel;
    }

    public String getFamilienstand() {
        return familienstand;
    }

    public void setFamilienstand(String familienstand) {
        this.familienstand = familienstand;
    }

    public String getReligion() {
        return religion;
    }

    public void setReligion(String religion) {
        this.religion = religion;
    }

    public String getVita() {
        return vita;
    }

    public void setVita(String vita) {
        this.vita = vita;
    }

    public String getParty() {
        return party;
    }

    public void setParty(String party) {
        this.party = party;
    }

    public String getPrimaryFoto() {
        return primaryFoto;
    }

    public void setPrimaryFoto(String primaryFoto) {
        this.primaryFoto = primaryFoto;
    }

    public List<Membership> getMemberships() {
        return memberships;
    }

    public void setMemberships(List<Membership> memberships) {
        this.memberships = memberships;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Speaker speaker)) return false;
        return Objects.equals(id, speaker.id) && Objects.equals(name, speaker.name)
                && Objects.equals(firstName, speaker.firstName) && Objects.equals(title, speaker.title)
                && Objects.equals(geburtsdatum, speaker.geburtsdatum) && Objects.equals(geburtsort, speaker.geburtsort)
                && Objects.equals(sterbedatum, speaker.sterbedatum) && Objects.equals(geschlecht, speaker.geschlecht)
                && Objects.equals(beruf, speaker.beruf) && Objects.equals(akademischertitel, speaker.akademischertitel)
                && Objects.equals(familienstand, speaker.familienstand) && Objects.equals(religion, speaker.religion)
                && Objects.equals(vita, speaker.vita) && Objects.equals(party, speaker.party) && Objects.equals(memberships, speaker.memberships);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, firstName, title, geburtsdatum, geburtsort, sterbedatum, geschlecht,
                beruf, akademischertitel, familienstand, religion, vita, party, memberships);
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", Speaker.class.getSimpleName() + "[", "]")
                .add("id='" + id + "'")
                .add("name='" + name + "'")
                .add("firstName='" + firstName + "'")
                .add("title='" + title + "'")
                .add("geburtsdatum=" + geburtsdatum)
                .add("geburtsort='" + geburtsort + "'")
                .add("sterbedatum=" + sterbedatum)
                .add("geschlecht='" + geschlecht + "'")
                .add("beruf='" + beruf + "'")
                .add("akademischertitel='" + akademischertitel + "'")
                .add("familienstand='" + familienstand + "'")
                .add("religion='" + religion + "'")
                .add("vita='" + vita + "'")
                .add("party='" + party + "'")
                .add("primaryFoto='" + primaryFoto + "'")
                .add("memberships=" + memberships)
                .toString();
    }
}
