from app.extensions import db
from .base import TimestampMixin
from .enums import ActivityStatus


class Activity(TimestampMixin, db.Model):
    __tablename__ = "activities"

    id = db.Column(db.Integer, primary_key=True)
    activity_code = db.Column(db.String(30), unique=True, nullable=False, index=True)
    title = db.Column(db.String(255), nullable=False)
    short_impact_statement = db.Column(db.String(500))
    description = db.Column(db.Text)
    what_you_will_do = db.Column(db.Text)
    what_to_carry = db.Column(db.Text)
    eligibility_requirements = db.Column(db.Text)
    safety_instructions = db.Column(db.Text)
    cause_category_id = db.Column(db.Integer, db.ForeignKey("cause_categories.id"), nullable=False)
    activity_type_id = db.Column(db.Integer, db.ForeignKey("activity_types.id"))
    partner_id = db.Column(db.Integer, db.ForeignKey("partners.id"))
    city_id = db.Column(db.Integer, db.ForeignKey("cities.id"), nullable=False)
    location_id = db.Column(db.Integer, db.ForeignKey("locations.id"))
    meeting_point = db.Column(db.String(500))
    start_datetime = db.Column(db.DateTime, nullable=False)
    end_datetime = db.Column(db.DateTime, nullable=False)
    registration_open_at = db.Column(db.DateTime)
    registration_close_at = db.Column(db.DateTime)
    capacity = db.Column(db.Integer, nullable=False, default=0)
    manager_approval_required = db.Column(db.Boolean, nullable=False, default=False)
    working_hours_activity = db.Column(db.Boolean, nullable=False, default=False)
    cancellation_cutoff_hours = db.Column(db.Integer, nullable=False, default=24)
    status = db.Column(db.String(30), nullable=False, default=ActivityStatus.DRAFT, index=True)
    published_at = db.Column(db.DateTime)
    completed_at = db.Column(db.DateTime)
    created_by_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    approved_by_id = db.Column(db.Integer, db.ForeignKey("users.id"))

    cause_category = db.relationship("CauseCategory")
    activity_type = db.relationship("ActivityType")
    partner = db.relationship("Partner")
    city = db.relationship("City")
    location = db.relationship("Location")
    images = db.relationship("ActivityImage", cascade="all, delete-orphan", back_populates="activity")


class ActivityImage(TimestampMixin, db.Model):
    __tablename__ = "activity_images"
    id = db.Column(db.Integer, primary_key=True)
    activity_id = db.Column(db.Integer, db.ForeignKey("activities.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)
    is_primary = db.Column(db.Boolean, nullable=False, default=False)

    activity = db.relationship("Activity", back_populates="images")


class SavedActivity(TimestampMixin, db.Model):
    __tablename__ = "saved_activities"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False)
    activity_id = db.Column(db.Integer, db.ForeignKey("activities.id"), nullable=False)

    __table_args__ = (
        db.UniqueConstraint("employee_id", "activity_id", name="uq_saved_activity"),
    )
