from app.extensions import db
from .base import TimestampMixin
from .enums import RegistrationStatus, ApprovalStatus


class ActivityRegistration(TimestampMixin, db.Model):
    __tablename__ = "activity_registrations"

    id = db.Column(db.Integer, primary_key=True)
    participation_id = db.Column(db.String(30), unique=True, nullable=False, index=True)
    activity_id = db.Column(db.Integer, db.ForeignKey("activities.id"), nullable=False, index=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False, index=True)
    status = db.Column(db.String(30), nullable=False, default=RegistrationStatus.REGISTERED, index=True)
    approval_status = db.Column(db.String(30), nullable=False, default=ApprovalStatus.NOT_REQUIRED, index=True)
    mobile = db.Column(db.String(30))
    emergency_contact_name = db.Column(db.String(150))
    emergency_contact_phone = db.Column(db.String(30))
    tshirt_size = db.Column(db.String(20))
    dietary_requirements = db.Column(db.String(500))
    accessibility_requirements = db.Column(db.String(500))
    participation_guidelines_accepted = db.Column(db.Boolean, nullable=False, default=False)
    consent_accepted = db.Column(db.Boolean, nullable=False, default=False)
    cancelled_at = db.Column(db.DateTime)
    cancellation_reason = db.Column(db.String(500))
    volunteer_hours = db.Column(db.Numeric(6, 2), nullable=False, default=0)

    activity = db.relationship("Activity")
    employee = db.relationship("Employee")
    attendance = db.relationship("ActivityAttendance", back_populates="registration", uselist=False, cascade="all, delete-orphan")

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


class ManagerApprovalRequest(TimestampMixin, db.Model):
    __tablename__ = "manager_approval_requests"

    id = db.Column(db.Integer, primary_key=True)
    registration_id = db.Column(db.Integer, db.ForeignKey("activity_registrations.id"), nullable=False, unique=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False)
    manager_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False)
    status = db.Column(db.String(30), nullable=False, default=ApprovalStatus.PENDING, index=True)
    note_to_manager = db.Column(db.Text)
    manager_response = db.Column(db.Text)
    requested_at = db.Column(db.DateTime, nullable=False)
    decided_at = db.Column(db.DateTime)
    expires_at = db.Column(db.DateTime)
    last_nudged_at = db.Column(db.DateTime)
    nudge_count = db.Column(db.Integer, nullable=False, default=0)

    registration = db.relationship("ActivityRegistration")
    employee = db.relationship("Employee", foreign_keys=[employee_id])
    manager = db.relationship("Employee", foreign_keys=[manager_id])
    history = db.relationship("ManagerApprovalHistory", back_populates="request", cascade="all, delete-orphan")


class ManagerApprovalHistory(TimestampMixin, db.Model):
    __tablename__ = "manager_approval_history"

    id = db.Column(db.Integer, primary_key=True)
    approval_request_id = db.Column(db.Integer, db.ForeignKey("manager_approval_requests.id"), nullable=False)
    action = db.Column(db.String(50), nullable=False)
    from_status = db.Column(db.String(30))
    to_status = db.Column(db.String(30), nullable=False)
    acted_by_user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    remarks = db.Column(db.Text)

    request = db.relationship("ManagerApprovalRequest", back_populates="history")


class ActivityAttendance(TimestampMixin, db.Model):
    __tablename__ = "activity_attendance"

    id = db.Column(db.Integer, primary_key=True)
    registration_id = db.Column(db.Integer, db.ForeignKey("activity_registrations.id"), nullable=False, unique=True)
    status = db.Column(db.String(30), nullable=False)  # PRESENT / ABSENT / NO_SHOW / CANCELLED
    check_in_at = db.Column(db.DateTime)
    check_out_at = db.Column(db.DateTime)
    volunteer_hours = db.Column(db.Numeric(6, 2), nullable=False, default=0)
    confirmed_by_user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    confirmed_at = db.Column(db.DateTime)
    remarks = db.Column(db.String(500))

    registration = db.relationship("ActivityRegistration", back_populates="attendance")


class ActivityFeedback(TimestampMixin, db.Model):
    __tablename__ = "activity_feedback"
    id = db.Column(db.Integer, primary_key=True)
    registration_id = db.Column(db.Integer, db.ForeignKey("activity_registrations.id"), nullable=False, unique=True)
    rating = db.Column(db.Integer)
    feedback = db.Column(db.Text)
