from typing import Optional, Dict, Any, List
from pydantic import BaseModel, Field
from datetime import datetime
from enum import Enum

class DocumentType(str, Enum):
    """Типы документов"""
    PDF = "pdf"
    EXCEL = "excel"
    WORD = "word"
    QR_CODE = "qr_code"

class DocumentStatus(str, Enum):
    """Статусы документов"""
    PENDING = "pending"
    PROCESSING = "processing"
    COMPLETED = "completed"
    FAILED = "failed"

class QRCodeRequest(BaseModel):
    """Запрос на генерацию QR-кода"""
    location_id: str = Field(..., description="ID места хранения")
    location_address: str = Field(..., description="Адрес места")
    organization_id: str = Field(..., description="ID организации")
    size: Optional[int] = Field(10, description="Размер QR-кода")
    border: Optional[int] = Field(2, description="Размер границы")

class QRCodeResponse(BaseModel):
    """Ответ с QR-кодом"""
    document_id: str = Field(..., description="ID документа")
    qr_code_url: str = Field(..., description="URL для скачивания QR-кода")
    qr_code_data: str = Field(..., description="Данные QR-кода")
    expires_at: datetime = Field(..., description="Время истечения")

class ReportRequest(BaseModel):
    """Запрос на генерацию отчета"""
    report_type: str = Field(..., description="Тип отчета")
    organization_id: str = Field(..., description="ID организации")
    filters: Optional[Dict[str, Any]] = Field({}, description="Фильтры для отчета")
    format: DocumentType = Field(DocumentType.PDF, description="Формат отчета")

class ReportResponse(BaseModel):
    """Ответ с отчетом"""
    document_id: str = Field(..., description="ID документа")
    download_url: str = Field(..., description="URL для скачивания")
    file_size: int = Field(..., description="Размер файла в байтах")
    expires_at: datetime = Field(..., description="Время истечения")

class DocumentStatusResponse(BaseModel):
    """Ответ со статусом документа"""
    document_id: str = Field(..., description="ID документа")
    status: DocumentStatus = Field(..., description="Статус документа")
    progress: Optional[int] = Field(None, description="Прогресс в процентах")
    error_message: Optional[str] = Field(None, description="Сообщение об ошибке")
    created_at: datetime = Field(..., description="Время создания")
    updated_at: datetime = Field(..., description="Время обновления")

class GeneratePDFRequest(BaseModel):
    """Запрос на генерацию PDF"""
    template_name: str = Field(..., description="Название шаблона")
    data: Dict[str, Any] = Field(..., description="Данные для шаблона")
    filename: Optional[str] = Field(None, description="Имя файла")

class GenerateExcelRequest(BaseModel):
    """Запрос на генерацию Excel"""
    data: List[Dict[str, Any]] = Field(..., description="Данные для таблицы")
    sheet_name: str = Field("Sheet1", description="Название листа")
    filename: Optional[str] = Field(None, description="Имя файла")

class TemplateInfo(BaseModel):
    """Информация о шаблоне"""
    name: str = Field(..., description="Название шаблона")
    description: str = Field(..., description="Описание шаблона")
    variables: List[str] = Field(..., description="Переменные шаблона")
    created_at: datetime = Field(..., description="Время создания")
    updated_at: datetime = Field(..., description="Время обновления")

class DocumentInfo(BaseModel):
    """Информация о документе"""
    id: str = Field(..., description="ID документа")
    type: DocumentType = Field(..., description="Тип документа")
    status: DocumentStatus = Field(..., description="Статус документа")
    filename: str = Field(..., description="Имя файла")
    file_size: int = Field(..., description="Размер файла")
    created_at: datetime = Field(..., description="Время создания")
    expires_at: datetime = Field(..., description="Время истечения")
