from app.extensions import db
from .base import TimestampMixin


class ImpactMetric(TimestampMixin, db.Model):
    __tablename__ = "impact_metrics"
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(50), unique=True, nullable=False)
    name = db.Column(db.String(150), nullable=False)
    unit = db.Column(db.String(50), nullable=False)
    methodology = db.Column(db.Text)
    default_verification_status = db.Column(db.String(30), nullable=False, default="UNVERIFIED")


class ImpactMetricValue(TimestampMixin, db.Model):
    __tablename__ = "impact_metric_values"
    id = db.Column(db.Integer, primary_key=True)
    impact_metric_id = db.Column(db.Integer, db.ForeignKey("impact_metrics.id"), nullable=False)
    activity_id = db.Column(db.Integer, db.ForeignKey("activities.id"))
    donation_cause_id = db.Column(db.Integer, db.ForeignKey("donation_causes.id"))
    numeric_value = db.Column(db.Numeric(18, 4), nullable=False)
    source = db.Column(db.String(500), nullable=False)
    data_owner = db.Column(db.String(255))
    verification_status = db.Column(db.String(30), nullable=False, default="UNVERIFIED")
    last_updated_at = db.Column(db.DateTime)
    approved_by_user_id = db.Column(db.Integer, db.ForeignKey("users.id"))


class ImpactStory(TimestampMixin, db.Model):
    __tablename__ = "impact_stories"
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255), nullable=False)
    story = db.Column(db.Text, nullable=False)
    image_path = db.Column(db.String(500))
    activity_id = db.Column(db.Integer, db.ForeignKey("activities.id"))
    donation_cause_id = db.Column(db.Integer, db.ForeignKey("donation_causes.id"))
    is_published = db.Column(db.Boolean, nullable=False, default=False)


class HeartRule(TimestampMixin, db.Model):
    __tablename__ = "heart_rules"
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(50), unique=True, nullable=False)
    action_type = db.Column(db.String(50), nullable=False)
    calculation_type = db.Column(db.String(30), nullable=False)  # FIXED / PER_UNIT
    unit_value = db.Column(db.Numeric(14, 2), nullable=False, default=1)
    hearts = db.Column(db.Integer, nullable=False)
    is_active = db.Column(db.Boolean, nullable=False, default=True)


class HeartTransaction(TimestampMixin, db.Model):
    __tablename__ = "heart_transactions"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False, index=True)
    rule_id = db.Column(db.Integer, db.ForeignKey("heart_rules.id"))
    source_type = db.Column(db.String(50), nullable=False)
    source_id = db.Column(db.Integer, nullable=False)
    transaction_type = db.Column(db.String(20), nullable=False, default="CREDIT")
    hearts = db.Column(db.Integer, nullable=False)
    description = db.Column(db.String(500))

    __table_args__ = (
        db.UniqueConstraint("employee_id", "source_type", "source_id", "rule_id", name="uq_heart_source_rule"),
    )


class Badge(TimestampMixin, db.Model):
    __tablename__ = "badges"
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(50), unique=True, nullable=False)
    name = db.Column(db.String(150), nullable=False)
    description = db.Column(db.String(500))
    icon_path = db.Column(db.String(500))
    hearts_required = db.Column(db.Integer)


class EmployeeBadge(TimestampMixin, db.Model):
    __tablename__ = "employee_badges"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False)
    badge_id = db.Column(db.Integer, db.ForeignKey("badges.id"), nullable=False)
    awarded_at = db.Column(db.DateTime, nullable=False)

    __table_args__ = (
        db.UniqueConstraint("employee_id", "badge_id", name="uq_employee_badge"),
    )
