from datetime import datetime
from app.extensions import db


# ═══════════════════════════════════════════════════════════════════════════════
#  Trainer Ticket Model
# ═══════════════════════════════════════════════════════════════════════════════

class TrainerTicket(db.Model):
    """Support/interaction tickets between students and trainers."""
    __tablename__ = "trainer_tickets"

    id = db.Column(db.Integer, primary_key=True)
    course_id = db.Column(db.Integer, db.ForeignKey("courses.id"), nullable=False)
    student_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    trainer_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)

    # Ticket Type: "help" for course help, "apply" for application/mentoring
    ticket_type = db.Column(db.String(50), nullable=False)  # help, apply
    subject = db.Column(db.String(255), nullable=False)

    # Status: open, in_progress, resolved, closed
    status = db.Column(db.String(20), default="open")

    # Application-specific fields (for "apply" ticket type)
    application_budget = db.Column(db.Float(), nullable=True)
    application_city = db.Column(db.String(255), nullable=True)
    application_timeline = db.Column(db.Text(), nullable=True)
    application_team_size = db.Column(db.Integer(), nullable=True)

    # Timestamps
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

    # Relationships
    course = db.relationship("Course", backref="tickets")
    student = db.relationship("User", foreign_keys=[student_id], backref="sent_tickets")
    trainer = db.relationship("User", foreign_keys=[trainer_id], backref="received_tickets")
    messages = db.relationship("TrainerTicketMessage", back_populates="ticket", lazy="dynamic",
                              cascade="all, delete-orphan", order_by="TrainerTicketMessage.created_at")

    @property
    def last_message(self):
        """Get the most recent message."""
        return self.messages.order_by(TrainerTicketMessage.created_at.desc()).first()

    @property
    def unread_count_for_user(self, user_id):
        """Count unread messages for a specific user."""
        return self.messages.filter_by(sender_id=user_id, is_read=False).count()

    @property
    def status_label_ar(self):
        """Get Arabic status label."""
        labels = {
            "open": "مفتوح",
            "in_progress": "قيد المعالجة",
            "resolved": "تم الحل",
            "closed": "مغلق"
        }
        return labels.get(self.status, self.status)

    @property
    def type_label_ar(self):
        """Get Arabic type label."""
        labels = {
            "help": "طلب مساعدة",
            "apply": "مساعدة في التنفيذ"
        }
        return labels.get(self.ticket_type, self.ticket_type)

    def __repr__(self):
        return f"<TrainerTicket {self.id}: {self.subject}>"


# ═══════════════════════════════════════════════════════════════════════════════
#  Trainer Ticket Message Model
# ═══════════════════════════════════════════════════════════════════════════════

class TrainerTicketMessage(db.Model):
    """Messages within trainer tickets."""
    __tablename__ = "trainer_ticket_messages"

    id = db.Column(db.Integer, primary_key=True)
    ticket_id = db.Column(db.Integer, db.ForeignKey("trainer_tickets.id"), nullable=False)
    sender_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
    message = db.Column(db.Text, nullable=False)
    is_read = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)

    # Relationships
    ticket = db.relationship("TrainerTicket", back_populates="messages")
    sender = db.relationship("User", backref="sent_ticket_messages")

    @property
    def is_from_student(self):
        """Check if message is from student (not trainer/admin)."""
        return self.sender_id == self.ticket.student_id

    def __repr__(self):
        return f"<TrainerTicketMessage {self.id} in ticket {self.ticket_id}>"
