from datetime import datetime

from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship

from database import Base


class Kampagne(Base):
    __tablename__ = "kampagne"

    id = Column(Integer, primary_key=True, autoincrement=True)
    titel = Column(String(300), nullable=False)
    beschreibung = Column(Text)
    typ = Column(String(50), default="sonstiges")  # mailing, telefonaktion, einladung, sonstiges
    status = Column(String(50), default="entwurf")  # entwurf, aktiv, abgeschlossen
    projekt = Column(String(200))

    erstellt_am = Column(DateTime, default=datetime.now)
    erstellt_von = Column(String(10))
    aktualisiert_am = Column(DateTime, default=datetime.now, onupdate=datetime.now)

    kontakte = relationship("KampagneKontakt", back_populates="kampagne", cascade="all, delete-orphan")
    aktivitaeten = relationship("Aktivitaet", back_populates="kampagne")
    veranstaltungen = relationship("Veranstaltung", back_populates="kampagne")
    spenden = relationship("Spende", back_populates="kampagne")

    TYP_LABELS = {
        "mailing": "Mailing",
        "telefonaktion": "Telefonaktion",
        "einladung": "Einladung",
        "sonstiges": "Sonstiges",
    }

    STATUS_LABELS = {
        "entwurf": "Entwurf",
        "aktiv": "Aktiv",
        "abgeschlossen": "Abgeschlossen",
    }

    @property
    def typ_label(self):
        return self.TYP_LABELS.get(self.typ, self.typ or "")

    @property
    def status_label(self):
        return self.STATUS_LABELS.get(self.status, self.status or "")


class KampagneKontakt(Base):
    __tablename__ = "kampagne_kontakt"

    id = Column(Integer, primary_key=True, autoincrement=True)
    kampagne_id = Column(Integer, ForeignKey("kampagne.id", ondelete="CASCADE"), nullable=False)
    kontakt_id = Column(Integer, ForeignKey("kontakt.id", ondelete="CASCADE"), nullable=False)
    status = Column(String(50), default="neu")  # neu, kontaktiert, reagiert, abgelehnt, erledigt
    notiz = Column(Text)
    hinzugefuegt_am = Column(DateTime, default=datetime.now)
    hinzugefuegt_von = Column(String(10))

    kampagne = relationship("Kampagne", back_populates="kontakte")
    kontakt = relationship("Kontakt", back_populates="kampagnen")

    STATUS_LABELS = {
        "neu": "Neu",
        "kontaktiert": "Kontaktiert",
        "reagiert": "Reagiert",
        "abgelehnt": "Abgelehnt",
        "abgemeldet": "Abgemeldet",
        "erledigt": "Erledigt",
    }

    @property
    def status_label(self):
        return self.STATUS_LABELS.get(self.status, self.status or "")
