from sqlalchemy import Boolean, Column, Integer, String, DateTime, Text, JSON, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.database import Base


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    username = Column(String(50), unique=True, index=True, nullable=False)
    email = Column(String(100), unique=True, index=True, nullable=False)
    hashed_password = Column(String(255), nullable=False)
    full_name = Column(String(100))
    is_active = Column(Boolean, default=True)
    is_superuser = Column(Boolean, default=False)
    is_verified = Column(Boolean, default=False)
    
    # تنظیمات کاربر
    risk_tolerance = Column(String(20), default="medium")  # low, medium, high, extreme
    require_confirmation = Column(Boolean, default=True)
    max_concurrent_tasks = Column(Integer, default=3)
    
    # اطلاعات امنیتی
    login_attempts = Column(Integer, default=0)
    last_login = Column(DateTime(timezone=True))
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), onupdate=func.now())
    
    # روابط
    sessions = relationship("UserSession", back_populates="user", cascade="all, delete-orphan")
    tasks = relationship("Task", back_populates="user", cascade="all, delete-orphan")
    logs = relationship("AuditLog", back_populates="user", cascade="all, delete-orphan")


class UserSession(Base):
    __tablename__ = "user_sessions"
    
    id = Column(String(100), primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"))
    access_token = Column(String(500))
    refresh_token = Column(String(500))
    ip_address = Column(String(45))
    user_agent = Column(Text)
    is_active = Column(Boolean, default=True)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    expires_at = Column(DateTime(timezone=True))
    
    user = relationship("User", back_populates="sessions")


class Task(Base):
    __tablename__ = "tasks"
    
    id = Column(String(50), primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"))
    title = Column(String(200), nullable=False)
    description = Column(Text)
    goal = Column(Text, nullable=False)
    
    # وضعیت
    status = Column(String(20), default="pending")  # pending, analyzing, executing, completed, failed, cancelled
    progress = Column(Integer, default=0)  # 0-100
    risk_level = Column(String(20))  # low, medium, high, extreme
    
    # نتیجه
    result_data = Column(JSON)
    error_message = Column(Text)
    execution_time = Column(Integer)  # در ثانیه
    
    # زمان‌ها
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    started_at = Column(DateTime(timezone=True))
    completed_at = Column(DateTime(timezone=True))
    
    # روابط
    user = relationship("User", back_populates="tasks")
    actions = relationship("Action", back_populates="task", cascade="all, delete-orphan")


class Action(Base):
    __tablename__ = "actions"
    
    id = Column(Integer, primary_key=True, index=True)
    task_id = Column(String(50), ForeignKey("tasks.id", ondelete="CASCADE"))
    action_type = Column(String(50), nullable=False)  # typing, mouse, click, screenshot, etc.
    description = Column(Text, nullable=False)
    
    # پارامترها
    parameters = Column(JSON)
    risk_assessment = Column(JSON)
    
    # وضعیت
    status = Column(String(20), default="pending")
    result = Column(JSON)
    requires_confirmation = Column(Boolean, default=False)
    confirmed = Column(Boolean, default=False)
    
    # زمان‌ها
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    executed_at = Column(DateTime(timezone=True))
    
    # روابط
    task = relationship("Task", back_populates="actions")


class AuditLog(Base):
    __tablename__ = "audit_logs"
    
    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"))
    event_type = Column(String(50), nullable=False)  # login, logout, task_create, action_execute, etc.
    event_details = Column(JSON)
    ip_address = Column(String(45))
    user_agent = Column(Text)
    severity = Column(String(20), default="info")  # info, warning, error, critical
    
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    
    user = relationship("User", back_populates="logs")


class SystemConfig(Base):
    __tablename__ = "system_configs"
    
    id = Column(Integer, primary_key=True, index=True)
    key = Column(String(100), unique=True, nullable=False)
    value = Column(JSON)
    description = Column(Text)
    
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), onupdate=func.now())
