from app.extensions import db
from .base import TimestampMixin
from .enums import CauseStatus, DonationStatus


class DonationCause(TimestampMixin, db.Model):
    __tablename__ = "donation_causes"

    id = db.Column(db.Integer, primary_key=True)
    cause_code = db.Column(db.String(30), unique=True, nullable=False, index=True)
    name = db.Column(db.String(255), nullable=False)
    cause_category_id = db.Column(db.Integer, db.ForeignKey("cause_categories.id"), nullable=False)
    partner_id = db.Column(db.Integer, db.ForeignKey("partners.id"))
    problem_statement = db.Column(db.Text)
    contribution_enables = db.Column(db.Text)
    fundraising_target = db.Column(db.Numeric(14, 2))
    start_date = db.Column(db.Date)
    end_date = db.Column(db.Date)
    status = db.Column(db.String(30), nullable=False, default=CauseStatus.DRAFT, index=True)
    receipt_configuration = db.Column(db.Text)
    created_by_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)

    cause_category = db.relationship("CauseCategory")
    partner = db.relationship("Partner")
    images = db.relationship("DonationCauseImage", cascade="all, delete-orphan")
    suggested_amounts = db.relationship("DonationSuggestedAmount", cascade="all, delete-orphan")


class DonationCauseImage(TimestampMixin, db.Model):
    __tablename__ = "donation_cause_images"
    id = db.Column(db.Integer, primary_key=True)
    donation_cause_id = db.Column(db.Integer, db.ForeignKey("donation_causes.id"), nullable=False)
    file_path = db.Column(db.String(500), nullable=False)
    alt_text = db.Column(db.String(255))
    sort_order = db.Column(db.Integer, nullable=False, default=0)


class DonationSuggestedAmount(TimestampMixin, db.Model):
    __tablename__ = "donation_suggested_amounts"
    id = db.Column(db.Integer, primary_key=True)
    donation_cause_id = db.Column(db.Integer, db.ForeignKey("donation_causes.id"), nullable=False)
    amount = db.Column(db.Numeric(14, 2), nullable=False)
    impact_text = db.Column(db.String(500))
    sort_order = db.Column(db.Integer, nullable=False, default=0)


class Donation(TimestampMixin, db.Model):
    __tablename__ = "donations"

    id = db.Column(db.Integer, primary_key=True)
    donation_no = db.Column(db.String(30), unique=True, nullable=False, index=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False, index=True)
    donation_cause_id = db.Column(db.Integer, db.ForeignKey("donation_causes.id"), nullable=False, index=True)
    amount = db.Column(db.Numeric(14, 2), nullable=False)
    currency = db.Column(db.String(3), nullable=False, default="INR")
    status = db.Column(db.String(30), nullable=False, default=DonationStatus.INITIATED, index=True)
    initiated_at = db.Column(db.DateTime, nullable=False)
    completed_at = db.Column(db.DateTime)

    employee = db.relationship("Employee")
    cause = db.relationship("DonationCause")
    transactions = db.relationship("DonationTransaction", cascade="all, delete-orphan", back_populates="donation")
    receipt = db.relationship("DonationReceipt", uselist=False, cascade="all, delete-orphan")


class DonationTransaction(TimestampMixin, db.Model):
    __tablename__ = "donation_transactions"

    id = db.Column(db.Integer, primary_key=True)
    donation_id = db.Column(db.Integer, db.ForeignKey("donations.id"), nullable=False, index=True)
    gateway = db.Column(db.String(50), nullable=False)
    gateway_order_id = db.Column(db.String(150), index=True)
    gateway_payment_id = db.Column(db.String(150), index=True)
    gateway_reference = db.Column(db.String(150), index=True)
    amount = db.Column(db.Numeric(14, 2), nullable=False)
    status = db.Column(db.String(30), nullable=False)
    gateway_response = db.Column(db.JSON)
    initiated_at = db.Column(db.DateTime, nullable=False)
    completed_at = db.Column(db.DateTime)

    donation = db.relationship("Donation", back_populates="transactions")


class DonationReceipt(TimestampMixin, db.Model):
    __tablename__ = "donation_receipts"

    id = db.Column(db.Integer, primary_key=True)
    donation_id = db.Column(db.Integer, db.ForeignKey("donations.id"), nullable=False, unique=True)
    receipt_number = db.Column(db.String(100), unique=True, nullable=False)
    receipt_date = db.Column(db.Date, nullable=False)
    receipt_file = db.Column(db.String(500))
    tax_certificate_file = db.Column(db.String(500))
    status = db.Column(db.String(30), nullable=False, default="AVAILABLE")


class DonationRefund(TimestampMixin, db.Model):
    __tablename__ = "donation_refunds"
    id = db.Column(db.Integer, primary_key=True)
    donation_id = db.Column(db.Integer, db.ForeignKey("donations.id"), nullable=False)
    amount = db.Column(db.Numeric(14, 2), nullable=False)
    gateway_refund_id = db.Column(db.String(150))
    status = db.Column(db.String(30), nullable=False)
    reason = db.Column(db.String(500))
