from __future__ import annotations
from datetime import datetime
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field


class PaginationMeta(BaseModel):
    page: int
    per_page: int
    total: int
    total_pages: int


class MerchantListItem(BaseModel):
    id: int
    name: str
    email: Optional[str] = None
    uin: str
    is_active: bool
    is_onboarded: bool
    status: Optional[str] = None
    created_at: Optional[datetime] = None

    class Config:
        from_attributes = True


class MerchantListResponse(BaseModel):
    items: List[MerchantListItem]
    meta: PaginationMeta


class MerchantDetail(BaseModel):
    id: int
    name: str
    email: Optional[str] = None
    uin: str
    merchant_id: Optional[str] = None
    is_active: bool
    is_onboarded: bool
    is_verified: bool
    approved_by: Optional[int] = None
    approved_at: Optional[datetime] = None
    deleted_at: Optional[datetime] = None
    created_at: Optional[datetime] = None
    status: Optional[str] = None

    class Config:
        from_attributes = True


class MerchantUpdateRequest(BaseModel):
    name: Optional[str] = None
    email: Optional[str] = None
    is_active: Optional[bool] = None
    is_onboarded: Optional[bool] = None
    is_verified: Optional[bool] = None


class DashboardStats(BaseModel):
    total_merchants: int
    merchants_by_status: Dict[str, int]
    transaction_counts: Dict[str, int]
    transaction_volume: Dict[str, float]
    new_merchants_this_month: int


class ImpersonationResponse(BaseModel):
    access_token: str
    token_type: str = "bearer"
    expires_in: int = 14400
    impersonated_merchant_id: int


class MerchantCreateRequest(BaseModel):
    merchant_name: str
    merchant_email: Optional[str] = None
    first_name: str
    last_name: str
    owner_email: str
    password: str
    confirm_password: str


class AdminUserCreate(BaseModel):
    email: str
    first_name: str
    last_name: str
    password: str


class AdminUserUpdate(BaseModel):
    email: Optional[str] = None
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    is_user_active: Optional[bool] = None


class AdminUserResponse(BaseModel):
    id: int
    email: str
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    is_superuser: bool
    is_user_active: bool
    created_at: Optional[datetime] = None

    class Config:
        from_attributes = True


class AuditLogEntry(BaseModel):
    id: int
    admin_user_id: int
    action: str
    target_type: str
    target_id: int
    metadata_: Optional[Dict[str, Any]] = Field(None, alias="metadata")
    ip_address: Optional[str] = None
    created_at: datetime

    class Config:
        from_attributes = True
        populate_by_name = True
