from app.extensions import db
from .base import TimestampMixin, SoftDeleteMixin


employee_cause_preferences = db.Table(
    "employee_cause_preferences",
    db.Column("employee_id", db.Integer, db.ForeignKey("employees.id"), primary_key=True),
    db.Column("cause_category_id", db.Integer, db.ForeignKey("cause_categories.id"), primary_key=True),
)


class Employee(TimestampMixin, SoftDeleteMixin, db.Model):
    __tablename__ = "employees"

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"), unique=True, nullable=False)
    employee_code = db.Column(db.String(50), unique=True, nullable=False, index=True)
    full_name = db.Column(db.String(255), nullable=False)
    official_email = db.Column(db.String(255), unique=True, nullable=False, index=True)
    mobile = db.Column(db.String(30))
    department_id = db.Column(db.Integer, db.ForeignKey("departments.id"))
    designation_id = db.Column(db.Integer, db.ForeignKey("designations.id"))
    business_unit_id = db.Column(db.Integer, db.ForeignKey("business_units.id"))
    city_id = db.Column(db.Integer, db.ForeignKey("cities.id"))
    location_id = db.Column(db.Integer, db.ForeignKey("locations.id"))
    manager_id = db.Column(db.Integer, db.ForeignKey("employees.id"))
    hrms_source_id = db.Column(db.String(100), index=True)
    eligible_for_portal = db.Column(db.Boolean, nullable=False, default=True)
    first_login_completed = db.Column(db.Boolean, nullable=False, default=False)

    user = db.relationship("User", back_populates="employee")
    manager = db.relationship("Employee", remote_side=[id], backref="reportees")
    department = db.relationship("Department")
    designation = db.relationship("Designation")
    business_unit = db.relationship("BusinessUnit")
    city = db.relationship("City")
    location = db.relationship("Location")
    cause_preferences = db.relationship("CauseCategory", secondary=employee_cause_preferences)


class EmployeePreference(TimestampMixin, db.Model):
    __tablename__ = "employee_preferences"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False, unique=True)
    accessibility_support = db.Column(db.Text)
    preferred_city_id = db.Column(db.Integer, db.ForeignKey("cities.id"))

    employee = db.relationship("Employee")


class EmployeeNotificationPreference(TimestampMixin, db.Model):
    __tablename__ = "employee_notification_preferences"
    id = db.Column(db.Integer, primary_key=True)
    employee_id = db.Column(db.Integer, db.ForeignKey("employees.id"), nullable=False)
    channel = db.Column(db.String(30), nullable=False)
    notification_type = db.Column(db.String(50), nullable=False)
    enabled = db.Column(db.Boolean, nullable=False, default=True)

    __table_args__ = (
        db.UniqueConstraint("employee_id", "channel", "notification_type", name="uq_emp_notification_pref"),
    )
