from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from datetime import datetime
import uuid

db = SQLAlchemy()

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)
    display_name = db.Column(db.String(100), nullable=False)
    role = db.Column(db.String(20), nullable=False) # SUPER_ADMIN, UPLOAD_OP, VERIFY_OP, FINANCE_OP
    is_active = db.Column(db.Boolean, default=True)

class Major(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    is_active = db.Column(db.Boolean, default=True)

class Seat(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(10), unique=True, nullable=False) # B01, T01, F01
    service_type = db.Column(db.String(20), nullable=False) # UPLOAD, VERIFICATION, FINANCE
    is_active = db.Column(db.Boolean, default=True)
    operator_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
    operator = db.relationship('User', backref='seat')

class Client(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    ticket_number = db.Column(db.Integer, unique=True, nullable=False)
    name = db.Column(db.String(100), nullable=False)
    national_id = db.Column(db.String(10), nullable=False)
    mobile = db.Column(db.String(11), nullable=False)
    major_id = db.Column(db.Integer, db.ForeignKey('major.id'), nullable=False)
    major = db.relationship('Major')
    service_request = db.Column(db.String(20), nullable=False) # UPLOAD, VERIFICATION, BOTH
    
    status = db.Column(db.String(30), default='WAITING_UPLOAD') 
    # WAITING_UPLOAD, IN_UPLOAD, WAITING_VERIFICATION, IN_VERIFICATION, WAITING_PAYMENT, PAID, CANCELLED, NO_SHOW
    
    price = db.Column(db.Integer, default=0)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    served_by_seat = db.Column(db.String(10), nullable=True)
    
    telegram_chat_id = db.Column(db.String(50), nullable=True)
    telegram_token = db.Column(db.String(100), default=lambda: str(uuid.uuid4()))

class AuditLog(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
    action = db.Column(db.String(50), nullable=False)
    details = db.Column(db.Text, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)