"""Pydantic models for Agent Application Portal"""
from pydantic import BaseModel, EmailStr, Field, ConfigDict
from typing import Optional, List, Literal, Dict
from datetime import datetime, timezone
import uuid


def utc_now_iso() -> str:
    return datetime.now(timezone.utc).isoformat()


def gen_id() -> str:
    return str(uuid.uuid4())


# ============== APPLICATION ==============
class ApplicationCreate(BaseModel):
    full_name: str = Field(min_length=2, max_length=100)
    email: EmailStr
    phone: str = Field(min_length=5, max_length=30)
    username: str = Field(min_length=3, max_length=50)
    city: str = Field(min_length=1, max_length=80)
    state: str = Field(min_length=1, max_length=80)
    telegram_username: str = Field(min_length=2, max_length=60)


class Application(BaseModel):
    model_config = ConfigDict(extra="ignore")
    id: str = Field(default_factory=gen_id)
    full_name: str
    email: str
    phone: str
    username: str
    city: str
    state: str
    telegram_username: str
    nid_front_path: Optional[str] = None
    nid_back_path: Optional[str] = None
    nid_selfie_path: Optional[str] = None
    status: Literal["pending_payment", "paid", "approved", "rejected"] = "pending_payment"
    payment_id: Optional[str] = None
    payment_status: Optional[str] = None
    pay_address: Optional[str] = None
    pay_amount: Optional[float] = None
    pay_currency: Optional[str] = None
    price_amount: float = 0.0
    base_amount: float = 0.0
    discount_amount: float = 0.0
    coupon_code: Optional[str] = None
    rejection_reason: Optional[str] = None
    admin_notes: Optional[str] = None
    created_at: str = Field(default_factory=utc_now_iso)
    updated_at: str = Field(default_factory=utc_now_iso)
    paid_at: Optional[str] = None
    decided_at: Optional[str] = None


class ApplicationPublicView(BaseModel):
    id: str
    full_name: str
    email: str
    status: str
    payment_status: Optional[str] = None
    price_amount: float
    discount_amount: float
    created_at: str


# ============== COUPON ==============
class CouponCreate(BaseModel):
    code: str = Field(min_length=2, max_length=40)
    discount_percent: float = Field(gt=0, le=100)
    max_uses: int = Field(default=0, ge=0)  # 0 = unlimited
    expires_at: Optional[str] = None
    active: bool = True
    description: Optional[str] = None


class CouponUpdate(BaseModel):
    discount_percent: Optional[float] = None
    max_uses: Optional[int] = None
    expires_at: Optional[str] = None
    active: Optional[bool] = None
    description: Optional[str] = None


class Coupon(BaseModel):
    model_config = ConfigDict(extra="ignore")
    id: str = Field(default_factory=gen_id)
    code: str
    discount_percent: float
    max_uses: int = 0
    used_count: int = 0
    expires_at: Optional[str] = None
    active: bool = True
    description: Optional[str] = None
    created_at: str = Field(default_factory=utc_now_iso)


class CouponValidateRequest(BaseModel):
    code: str


# ============== SETTINGS ==============
class Settings(BaseModel):
    model_config = ConfigDict(extra="ignore")
    id: str = "global"
    agent_fee_usd: float = 300.0
    telegram_manager_username: str = "maxlife88_support"
    telegram_manager_url: str = "https://t.me/maxlife88_support"
    site_name: str = "Maxlife88 Agent Portal"
    sender_email: str = "onboarding@resend.dev"
    notification_email: str = "admin@maxlife88.com"
    # SMTP (preferred over Resend if smtp_host is set)
    smtp_host: str = ""
    smtp_port: int = 465
    smtp_user: str = ""
    smtp_password: str = ""
    smtp_from_name: str = "Maxlife88 Agent Portal"
    smtp_use_ssl: bool = True  # True = SSL (port 465), False = STARTTLS (port 587)
    # Payment Gateway — NOWPayments (DB-backed; cPanel-safe so admin can edit via UI)
    nowpayments_api_key: str = ""
    nowpayments_ipn_secret: str = ""
    nowpayments_public_url: str = ""  # External URL for IPN webhook callback
    # App download page (controlled via admin panel)
    app_brand_name: str = "Maxlife88"
    app_tagline: str = "Bangladesh's #1 Casino & Sports Betting App"
    app_android_url: str = ""
    app_ios_url: str = ""
    app_register_url: str = ""
    app_welcome_bonus: str = "100% Welcome Bonus up to 12,000 BDT"
    app_min_deposit: str = "100 BDT"
    app_page_active: bool = True
    # Extended app page customization
    app_user_count: str = "500,000+"
    app_rating: float = 4.9
    app_apk_version: str = "v2.4.1"
    app_apk_size: str = "32 MB"
    app_register_cta_label: str = "Register & Claim Bonus"
    app_promo_label: str = "Limited Time · 100% Bonus"
    app_disclaimer: str = "Gambling can be addictive — please play responsibly. Must be 18+ and reside in a jurisdiction where online gambling is permitted."
    app_jackpot_amount: str = "BDT 1,24,87,500"
    # Landing page stats (Agent Application portal home `/`)
    landing_active_agents: str = ""  # blank = use real count from DB
    landing_uptime_pct: str = "99.9%"
    landing_avg_approval: str = "24h"
    landing_cities_covered: str = "30+"
    # Landing page content (Agent portal hero / benefits / FAQ)
    landing_hero_badge: str = "Now accepting agent applications · Limited slots"
    landing_hero_title_prefix: str = "Become a Verified"
    landing_hero_title_highlight: str = "Maxlife88 Agent"
    landing_hero_title_suffix: str = "— earn from every referral."
    landing_hero_subtitle: str = "Join Bangladesh's most trusted agent network. Get instant USDT settlements, dedicated support and marketing tools — all backed by our licensed gaming platform."
    landing_hero_subtitle_bn: str = "বাংলাদেশের সবচেয়ে বিশ্বস্ত এজেন্ট নেটওয়ার্কে যোগ দিন। ইনস্ট্যান্ট USDT সেটেলমেন্ট, ডেডিকেটেড সাপোর্ট এবং মার্কেটিং টুলস।"
    landing_hero_apply_label: str = "Start Application"
    landing_hero_status_label: str = "Track My Application"
    landing_trust_badges: List[Dict] = Field(default_factory=lambda: [
        {"label": "256-bit SSL", "icon": "lock"},
        {"label": "KYC verified", "icon": "file-check"},
        {"label": "Licensed operator", "icon": "badge-check"},
        {"label": "24h approval", "icon": "clock"},
    ])
    # Stats card text
    landing_stats_label_agents: str = "Active Agents"
    landing_stats_label_agents_bn: str = "সক্রিয় এজেন্ট"
    landing_stats_label_uptime: str = "Uptime"
    landing_stats_label_uptime_bn: str = "আপটাইম"
    landing_stats_label_approval: str = "Avg. Approval"
    landing_stats_label_approval_bn: str = "অনুমোদন সময়"
    landing_stats_label_cities: str = "Cities Covered"
    landing_stats_label_cities_bn: str = "শহরে আছি"
    # Why Maxlife88 section
    landing_why_label: str = "Why Maxlife88"
    landing_why_title: str = "Built for serious agents"
    landing_why_subtitle: str = "Everything you need to run a profitable agent operation — no friction, no surprises."
    landing_why_subtitle_bn: str = "আপনার এজেন্ট অপারেশন চালাতে যা যা প্রয়োজন।"
    # How it works section
    landing_process_label: str = "Process"
    landing_process_title: str = "How it works"
    landing_process_title_bn: str = "কিভাবে কাজ করে"
    landing_steps: List[Dict] = Field(default_factory=lambda: [
        {"n": "01", "title": "Submit application", "title_bn": "আবেদন জমা দিন", "desc": "Fill out your details and upload NID for KYC verification."},
        {"n": "02", "title": "Pay the activation fee", "title_bn": "অ্যাক্টিভেশন ফি দিন", "desc": "Secure USDT payment via BEP-20 or TRC-20. Apply a coupon if you have one."},
        {"n": "03", "title": "Get reviewed", "title_bn": "রিভিউ হবে", "desc": "Our compliance team verifies your KYC documents — usually within 24 hours."},
        {"n": "04", "title": "Start earning", "title_bn": "ইনকাম শুরু করুন", "desc": "Receive your agent credentials on Telegram and begin onboarding players."},
    ])
    # Testimonials section
    landing_testimonials_label: str = "From our agents"
    landing_testimonials_title: str = "Trusted by agents"
    landing_testimonials_title_bn: str = "এজেন্টদের ভরসা"
    landing_testimonials: List[Dict] = Field(default_factory=lambda: [
        {"name": "Karim H.", "city": "Dhaka", "rating": 5, "text": "Withdrawals always hit my USDT wallet within minutes. The dedicated manager is super responsive on Telegram.", "text_bn": "USDT উইথড্র সবসময় কয়েক মিনিটেই চলে আসে।"},
        {"name": "Rakib A.", "city": "Chittagong", "rating": 5, "text": "Best commission structure I've seen. Marketing materials are polished and ready to share.", "text_bn": "সবচেয়ে ভালো কমিশন রেট, মার্কেটিং ম্যাটেরিয়ালও দারুণ।"},
        {"name": "Fahim R.", "city": "Sylhet", "rating": 5, "text": "Application got approved in under 12 hours. Onboarding via Telegram was smooth and professional.", "text_bn": "১২ ঘন্টার মধ্যেই অনুমোদন পেয়েছি, খুব প্রফেশনাল।"},
    ])
    # Pricing card
    landing_pricing_label: str = "One-time activation"
    landing_pricing_description: str = "Lifetime access to the agent dashboard, marketing tools and a dedicated manager."
    landing_pricing_description_bn: str = "এজেন্ট ড্যাশবোর্ড এবং সাপোর্টে আজীবন এক্সেস।"
    landing_pricing_features: List[str] = Field(default_factory=lambda: [
        "Lifetime agent access",
        "Dedicated Telegram manager",
        "Marketing creatives & links",
    ])
    landing_pricing_apply_cta: str = "Apply now"
    landing_pricing_telegram_cta: str = "Talk to manager"
    landing_pricing_coupon_hint: str = "Have a coupon code? Apply it during checkout for instant discount."
    landing_pricing_coupon_hint_bn: str = "চেকআউটে কুপন ব্যবহার করে ডিসকাউন্ট নিন।"
    # FAQ section
    landing_faq_label: str = "FAQ"
    landing_faq_title: str = "Common questions"
    landing_faq_title_bn: str = "সাধারণ প্রশ্ন"
    # Footer
    footer_tagline: str = "Bangladesh's most trusted agent network."
    footer_tagline_bn: str = "বাংলাদেশের সবচেয়ে বিশ্বস্ত এজেন্ট নেটওয়ার্ক।"
    footer_copyright: str = "© 2026 Maxlife88. All rights reserved."
    landing_benefits: List[Dict] = Field(default_factory=lambda: [
        {"title": "High commission rates", "title_bn": "সর্বোচ্চ কমিশন রেট", "description": "Industry-leading payouts on every player you bring on board."},
        {"title": "Dedicated manager", "title_bn": "ডেডিকেটেড ম্যানেজার", "description": "Personal Telegram manager for 24/7 support and faster resolutions."},
        {"title": "Instant withdrawals", "title_bn": "ইনস্ট্যান্ট উইথড্রয়াল", "description": "USDT-powered settlements directly to your wallet — no waiting."},
        {"title": "Marketing toolkit", "title_bn": "মার্কেটিং টুলকিট", "description": "Banners, links and creatives ready-to-share with your audience."},
    ])
    landing_faqs: List[Dict] = Field(default_factory=lambda: [
        {"question": "How long does approval take? / অনুমোদনে কতক্ষণ লাগে?", "answer": "Typically within 24 hours after payment is received and KYC documents are verified. সাধারণত পেমেন্ট ও KYC যাচাইয়ের পর ২৪ ঘন্টার মধ্যে।"},
        {"question": "What if my application is rejected? / আবেদন রিজেক্ট হলে?", "answer": "You will receive an email with the reason. You can re-upload NID and resubmit without paying again. কারণসহ ইমেইল পাবেন; নতুন NID দিয়ে আবার পাঠাতে পারবেন, পেমেন্ট লাগবে না।"},
        {"question": "Is my NID information secure? / NID নিরাপদ?", "answer": "Yes — uploaded only to our encrypted admin panel and never shared. Used purely for KYC verification."},
        {"question": "Which networks do you accept? / কোন নেটওয়ার্ক?", "answer": "USDT on BEP-20 (Binance Smart Chain) and TRC-20 (Tron) via NOWPayments."},
    ])
    updated_at: str = Field(default_factory=utc_now_iso)


class SettingsUpdate(BaseModel):
    agent_fee_usd: Optional[float] = None
    telegram_manager_username: Optional[str] = None
    telegram_manager_url: Optional[str] = None
    site_name: Optional[str] = None
    sender_email: Optional[str] = None
    notification_email: Optional[str] = None
    smtp_host: Optional[str] = None
    smtp_port: Optional[int] = None
    smtp_user: Optional[str] = None
    smtp_password: Optional[str] = None
    smtp_from_name: Optional[str] = None
    smtp_use_ssl: Optional[bool] = None
    nowpayments_api_key: Optional[str] = None
    nowpayments_ipn_secret: Optional[str] = None
    nowpayments_public_url: Optional[str] = None
    app_brand_name: Optional[str] = None
    app_tagline: Optional[str] = None
    app_android_url: Optional[str] = None
    app_ios_url: Optional[str] = None
    app_register_url: Optional[str] = None
    app_welcome_bonus: Optional[str] = None
    app_min_deposit: Optional[str] = None
    app_page_active: Optional[bool] = None
    app_user_count: Optional[str] = None
    app_rating: Optional[float] = None
    app_apk_version: Optional[str] = None
    app_apk_size: Optional[str] = None
    app_register_cta_label: Optional[str] = None
    app_promo_label: Optional[str] = None
    app_disclaimer: Optional[str] = None
    app_jackpot_amount: Optional[str] = None
    landing_active_agents: Optional[str] = None
    landing_uptime_pct: Optional[str] = None
    landing_avg_approval: Optional[str] = None
    landing_cities_covered: Optional[str] = None
    landing_hero_badge: Optional[str] = None
    landing_hero_title_prefix: Optional[str] = None
    landing_hero_title_highlight: Optional[str] = None
    landing_hero_title_suffix: Optional[str] = None
    landing_hero_subtitle: Optional[str] = None
    landing_hero_subtitle_bn: Optional[str] = None
    landing_hero_apply_label: Optional[str] = None
    landing_hero_status_label: Optional[str] = None
    landing_trust_badges: Optional[List[Dict]] = None
    landing_stats_label_agents: Optional[str] = None
    landing_stats_label_agents_bn: Optional[str] = None
    landing_stats_label_uptime: Optional[str] = None
    landing_stats_label_uptime_bn: Optional[str] = None
    landing_stats_label_approval: Optional[str] = None
    landing_stats_label_approval_bn: Optional[str] = None
    landing_stats_label_cities: Optional[str] = None
    landing_stats_label_cities_bn: Optional[str] = None
    landing_why_label: Optional[str] = None
    landing_why_title: Optional[str] = None
    landing_why_subtitle: Optional[str] = None
    landing_why_subtitle_bn: Optional[str] = None
    landing_process_label: Optional[str] = None
    landing_process_title: Optional[str] = None
    landing_process_title_bn: Optional[str] = None
    landing_steps: Optional[List[Dict]] = None
    landing_testimonials_label: Optional[str] = None
    landing_testimonials_title: Optional[str] = None
    landing_testimonials_title_bn: Optional[str] = None
    landing_testimonials: Optional[List[Dict]] = None
    landing_pricing_label: Optional[str] = None
    landing_pricing_description: Optional[str] = None
    landing_pricing_description_bn: Optional[str] = None
    landing_pricing_features: Optional[List[str]] = None
    landing_pricing_apply_cta: Optional[str] = None
    landing_pricing_telegram_cta: Optional[str] = None
    landing_pricing_coupon_hint: Optional[str] = None
    landing_pricing_coupon_hint_bn: Optional[str] = None
    landing_faq_label: Optional[str] = None
    landing_faq_title: Optional[str] = None
    landing_faq_title_bn: Optional[str] = None
    footer_tagline: Optional[str] = None
    footer_tagline_bn: Optional[str] = None
    footer_copyright: Optional[str] = None
    landing_benefits: Optional[List[Dict]] = None
    landing_faqs: Optional[List[Dict]] = None


# ============== AUTH ==============
class AdminLoginRequest(BaseModel):
    email: EmailStr
    password: str


class TokenResponse(BaseModel):
    access_token: str
    token_type: str = "bearer"
    admin_email: str


# ============== PAYMENT ==============
class CreatePaymentRequest(BaseModel):
    application_id: str
    pay_currency: Literal["usdtbsc", "usdttrc20"]
    coupon_code: Optional[str] = None


class CreatePaymentResponse(BaseModel):
    payment_id: str
    pay_address: str
    pay_amount: float
    pay_currency: str
    price_amount: float
    base_amount: float
    discount_amount: float
    coupon_code: Optional[str] = None
    status: str
    expires_at: Optional[str] = None


# ============== ADMIN ACTIONS ==============
class RejectRequest(BaseModel):
    reason: str = Field(min_length=2, max_length=500)


class StatusCheckRequest(BaseModel):
    email: EmailStr
    application_id: str


# ============== ADMIN EDIT / REUPLOAD ==============
class ApplicationAdminUpdate(BaseModel):
    """Editable fields for admins to fix typos / correct details."""
    full_name: Optional[str] = Field(default=None, min_length=2, max_length=100)
    email: Optional[EmailStr] = None
    phone: Optional[str] = Field(default=None, min_length=5, max_length=30)
    username: Optional[str] = Field(default=None, min_length=3, max_length=50)
    city: Optional[str] = Field(default=None, min_length=1, max_length=80)
    state: Optional[str] = Field(default=None, min_length=1, max_length=80)
    telegram_username: Optional[str] = Field(default=None, min_length=3, max_length=60)
    admin_notes: Optional[str] = Field(default=None, max_length=2000)

