from __future__ import annotations

from datetime import date, datetime

from ..extensions import db


class Invoice(db.Model):
    __tablename__ = "invoices"

    id = db.Column(db.Integer, primary_key=True)

    year = db.Column(db.Integer, nullable=False, index=True)
    number_seq = db.Column(db.Integer, nullable=False)
    number_text = db.Column(db.String(32), nullable=False)

    tipo_documento = db.Column(db.String(8), nullable=False, default="TD01")
    currency = db.Column(db.String(4), nullable=False, default="EUR")
    issue_date = db.Column(db.Date, nullable=False, default=date.today)

    transmission_progressivo = db.Column(db.String(16), nullable=True)

    bollo_virtuale = db.Column(db.Boolean, nullable=False, default=False)
    bollo_amount = db.Column(db.Numeric(10, 2), nullable=True)

    totale_prestazioni = db.Column(db.Numeric(10, 2), nullable=False, default=0)
    importo_totale_documento = db.Column(db.Numeric(10, 2), nullable=False, default=0)

    causale = db.Column(db.Text, nullable=True)

    client_id = db.Column(db.Integer, db.ForeignKey("clients.id"), nullable=True, index=True)
    company_id = db.Column(db.Integer, db.ForeignKey("companies.id"), nullable=True, index=True)

    # Frozen parties snapshot (JSON string). Used to keep issued invoices stable
    # even if the linked Client/Company gets edited or deleted.
    client_snapshot_json = db.Column(db.Text, nullable=True)
    company_snapshot_json = db.Column(db.Text, nullable=True)

    created_by = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=True, index=True)

    created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    updated_at = db.Column(
        db.DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow
    )

    __table_args__ = (
        db.UniqueConstraint("year", "number_seq", name="uq_invoices_year_seq"),
    )
