from app.extensions import db


class Customer(db.Model):
    __tablename__ = "customers"

    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(120), nullable=False)
    last_name = db.Column(db.String(120), nullable=False)
    city = db.Column(db.String(100))
    landline_phone = db.Column(db.String(30))
    mobile_phone = db.Column(db.String(30))
    referrer_customer_id = db.Column(db.Integer, db.ForeignKey("customers.id", ondelete="SET NULL"))
    referrer_text = db.Column(db.String(200))
    address = db.Column(db.Text)
    gender = db.Column(db.String(10))
    birth_date = db.Column(db.Date)
    customer_code = db.Column(db.String(30), unique=True)
    instagram_id = db.Column(db.String(100))
    how_found = db.Column(db.String(200))
    description = db.Column(db.Text)
    photo_path = db.Column(db.String(255))  # کلید آبجکت روی فضای ذخیره‌سازی، نه مسیر فایل
    status = db.Column(db.String(20), default="new")  # new|active|inactive|sleeping
    rating = db.Column(db.String(5), default="C")  # A+|A|B|C|D
    rating_is_manual = db.Column(db.Boolean, nullable=False, default=False)
    joined_at = db.Column(db.DateTime, nullable=False, server_default=db.func.now())
    created_by = db.Column(db.Integer, db.ForeignKey("users.id"))
    is_deleted = db.Column(db.Boolean, nullable=False, default=False)  # حذف نرم
    next_call_date = db.Column(db.Date)  # تاریخ تماس بعدی — مستقیم قابل تنظیم از پرونده مشتری

    purchases = db.relationship(
        "Purchase", backref="customer", cascade="all, delete-orphan", lazy="selectin"
    )
    referrer = db.relationship("Customer", remote_side=[id])

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"

    @property
    def total_amount(self):
        return sum((p.amount or 0) for p in self.purchases)

    @property
    def total_weight(self):
        return sum((p.weight or 0) for p in self.purchases)


class Purchase(db.Model):
    __tablename__ = "purchases"

    id = db.Column(db.Integer, primary_key=True)
    customer_id = db.Column(db.Integer, db.ForeignKey("customers.id", ondelete="CASCADE"), nullable=False)
    amount = db.Column(db.Numeric(14, 2), nullable=False, default=0)  # تومان
    weight = db.Column(db.Numeric(10, 3), nullable=False, default=0)  # گرم
    description = db.Column(db.Text)
    purchase_date = db.Column(db.Date, nullable=False)
    registered_by = db.Column(db.Integer, db.ForeignKey("users.id"))
    created_at = db.Column(db.DateTime, nullable=False, server_default=db.func.now())
