"""
Admin Panel Models - Multi-tenant system with Super Admin, Admin, User roles
"""
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from datetime import datetime
from enum import Enum


class PlanType(str, Enum):
    FREE = "free"
    BASIC = "basic"
    PRO = "pro"
    ENTERPRISE = "enterprise"


class UserStatus(str, Enum):
    PENDING = "pending"
    APPROVED = "approved"
    REJECTED = "rejected"
    SUSPENDED = "suspended"


class TicketStatus(str, Enum):
    OPEN = "open"
    IN_PROGRESS = "in_progress"
    RESOLVED = "resolved"
    CLOSED = "closed"


class TicketPriority(str, Enum):
    LOW = "low"
    MEDIUM = "medium"
    HIGH = "high"
    CRITICAL = "critical"


# ==================== Organization/Tenant ====================

class OrganizationCreate(BaseModel):
    name: str
    domain: Optional[str] = None
    logo_url: Optional[str] = None
    primary_color: str = "#3b82f6"
    plan: PlanType = PlanType.FREE


class Organization(BaseModel):
    id: str
    name: str
    domain: Optional[str] = None
    logo_url: Optional[str] = None
    front_image_url: Optional[str] = None
    primary_color: str = "#3b82f6"
    plan: PlanType = PlanType.FREE
    owner_id: str
    created_at: datetime
    is_active: bool = True
    settings: Dict[str, Any] = {}
    features_enabled: Dict[str, bool] = {}
    api_key: Optional[str] = None
    max_users: int = 5
    max_devices: int = 50


# ==================== Feature Toggles ====================

class FeatureConfig(BaseModel):
    """Module-level feature toggles"""
    snmp_enabled: bool = True
    mikrotik_enabled: bool = True
    cisco_enabled: bool = True
    huawei_enabled: bool = True
    ai_config_enabled: bool = True
    ai_troubleshoot_enabled: bool = True
    traffic_analysis_enabled: bool = True
    topology_enabled: bool = True
    alerts_enabled: bool = True
    reports_enabled: bool = True
    backups_enabled: bool = True
    firmware_enabled: bool = True
    assets_enabled: bool = True
    map_enabled: bool = True
    support_enabled: bool = True
    billing_enabled: bool = False


# ==================== User Approval ====================

class UserApprovalRequest(BaseModel):
    user_id: str
    status: UserStatus
    reason: Optional[str] = None


class PendingUser(BaseModel):
    id: str
    email: str
    username: str
    organization_id: Optional[str] = None
    status: UserStatus = UserStatus.PENDING
    requested_at: datetime
    reviewed_at: Optional[datetime] = None
    reviewed_by: Optional[str] = None
    rejection_reason: Optional[str] = None


# ==================== API Settings ====================

class APISettings(BaseModel):
    id: str
    organization_id: str
    name: str
    api_key: str
    provider: str  # openai, anthropic, gemini, custom
    is_active: bool = True
    created_at: datetime
    last_used: Optional[datetime] = None
    usage_count: int = 0


class APISettingsCreate(BaseModel):
    name: str
    api_key: str
    provider: str = "openai"


# ==================== Support Tickets ====================

class SupportTicketCreate(BaseModel):
    subject: str
    description: str
    priority: TicketPriority = TicketPriority.MEDIUM
    category: str = "general"


class SupportTicket(BaseModel):
    id: str
    organization_id: str
    user_id: str
    user_email: str
    subject: str
    description: str
    priority: TicketPriority
    status: TicketStatus = TicketStatus.OPEN
    category: str
    created_at: datetime
    updated_at: datetime
    resolved_at: Optional[datetime] = None
    assigned_to: Optional[str] = None
    messages: List[Dict[str, Any]] = []


class TicketMessage(BaseModel):
    message: str
    is_admin: bool = False


# ==================== Login Logs ====================

class LoginLog(BaseModel):
    id: str
    user_id: str
    user_email: str
    organization_id: Optional[str] = None
    ip_address: str
    user_agent: str
    login_time: datetime
    success: bool
    failure_reason: Optional[str] = None
    location: Optional[str] = None


# ==================== Billing ====================

class BillingPlan(BaseModel):
    id: str
    name: str
    plan_type: PlanType
    price_monthly: float
    price_yearly: float
    max_users: int
    max_devices: int
    features: List[str]
    is_active: bool = True


class Subscription(BaseModel):
    id: str
    organization_id: str
    plan_id: str
    plan_type: PlanType
    status: str  # active, cancelled, expired, trial
    start_date: datetime
    end_date: Optional[datetime] = None
    is_annual: bool = False
    amount_paid: float = 0
    next_billing_date: Optional[datetime] = None


class Invoice(BaseModel):
    id: str
    organization_id: str
    subscription_id: str
    amount: float
    currency: str = "USD"
    status: str  # pending, paid, failed, refunded
    created_at: datetime
    paid_at: Optional[datetime] = None
    payment_method: Optional[str] = None


# ==================== App Updates ====================

class AppUpdate(BaseModel):
    id: str
    version: str
    release_notes: str
    download_url: Optional[str] = None
    is_mandatory: bool = False
    released_at: datetime
    min_supported_version: Optional[str] = None


# ==================== Data Import ====================

class DataImportJob(BaseModel):
    id: str
    organization_id: str
    user_id: str
    file_name: str
    file_type: str  # csv, json, xlsx
    import_type: str  # devices, users, assets
    status: str  # pending, processing, completed, failed
    total_records: int = 0
    processed_records: int = 0
    failed_records: int = 0
    errors: List[str] = []
    started_at: datetime
    completed_at: Optional[datetime] = None


# ==================== User Settings ====================

class UserSettings(BaseModel):
    user_id: str
    theme: str = "dark"  # dark, light, system
    language: str = "en"
    notifications_enabled: bool = True
    email_notifications: bool = True
    dashboard_layout: Dict[str, Any] = {}
    sidebar_collapsed: bool = False


class ProfileUpdate(BaseModel):
    username: Optional[str] = None
    email: Optional[str] = None
    phone: Optional[str] = None
    avatar_url: Optional[str] = None
    timezone: Optional[str] = None


# ==================== Map Settings ====================

class MapMarker(BaseModel):
    id: str
    organization_id: str
    device_id: Optional[str] = None
    name: str
    latitude: float
    longitude: float
    marker_type: str = "device"  # device, location, custom
    icon: Optional[str] = None
    color: str = "#3b82f6"
    metadata: Dict[str, Any] = {}


class MapSettings(BaseModel):
    organization_id: str
    default_center: Dict[str, float] = {"lat": 0, "lng": 0}
    default_zoom: int = 10
    map_style: str = "dark"  # dark, light, satellite
    show_device_status: bool = True
    cluster_markers: bool = True
