from pydantic import BaseModel, EmailStr, Field, validator
from typing import Optional, List, Dict, Any
from datetime import datetime


# پایه
class BaseSchema(BaseModel):
    class Config:
        from_attributes = True
        json_encoders = {
            datetime: lambda dt: dt.isoformat()
        }


# کاربر
class UserBase(BaseSchema):
    username: str = Field(..., min_length=3, max_length=50)
    email: EmailStr
    full_name: Optional[str] = Field(None, max_length=100)


class UserCreate(UserBase):
    password: str = Field(..., min_length=8)
    
    @validator('password')
    def validate_password(cls, v):
        from app.core.security import validate_password_strength
        strength = validate_password_strength(v)
        if not all(strength.values()):
            raise ValueError("رمز عبور باید حداقل ۸ کاراکتر، حرف بزرگ، کوچک، عدد و کاراکتر خاص داشته باشد")
        return v


class UserUpdate(BaseSchema):
    email: Optional[EmailStr] = None
    full_name: Optional[str] = None
    risk_tolerance: Optional[str] = None
    require_confirmation: Optional[bool] = None


class UserInDB(UserBase):
    id: int
    is_active: bool
    is_superuser: bool
    is_verified: bool
    risk_tolerance: str
    require_confirmation: bool
    created_at: datetime
    
    class Config:
        from_attributes = True


class UserResponse(UserInDB):
    pass


class Token(BaseSchema):
    access_token: str
    refresh_token: str
    token_type: str = "bearer"
    session_id: str
    user: UserResponse


class LoginRequest(BaseSchema):
    username: str
    password: str
    remember_me: bool = False


# تسک
class TaskBase(BaseSchema):
    title: str = Field(..., max_length=200)
    description: Optional[str] = None
    goal: str = Field(..., min_length=10)


class TaskCreate(TaskBase):
    pass


class TaskUpdate(BaseSchema):
    status: Optional[str] = None
    progress: Optional[int] = None
    result_data: Optional[Dict[str, Any]] = None
    error_message: Optional[str] = None


class TaskInDB(TaskBase):
    id: str
    user_id: int
    status: str
    progress: int
    risk_level: Optional[str]
    result_data: Optional[Dict[str, Any]]
    error_message: Optional[str]
    execution_time: Optional[int]
    created_at: datetime
    started_at: Optional[datetime]
    completed_at: Optional[datetime]
    
    class Config:
        from_attributes = True


# اکشن
class ActionBase(BaseSchema):
    action_type: str
    description: str
    parameters: Dict[str, Any]


class ActionCreate(ActionBase):
    pass


class ActionInDB(ActionBase):
    id: int
    task_id: str
    status: str
    risk_assessment: Optional[Dict[str, Any]]
    result: Optional[Dict[str, Any]]
    requires_confirmation: bool
    confirmed: bool
    created_at: datetime
    executed_at: Optional[datetime]
    
    class Config:
        from_attributes = True


# ریسک
class RiskAssessment(BaseSchema):
    level: str  # low, medium, high, extreme
    description: str
    legal_warnings: List[str]
    potential_damage: str
    required_confirmation: bool
    confirmation_code: Optional[str]


# سیستم
class SystemStatus(BaseSchema):
    users_count: int
    active_sessions: int
    pending_tasks: int
    running_tasks: int
    system_load: float
    memory_usage: float
    uptime: int


class ConfigUpdate(BaseSchema):
    key: str
    value: Any
