# -*- coding: utf-8 -*-
import logging
import requests
import jdatetime
import urllib3
from config import API_URL, API_BEARER_TOKEN
from database import get_setting

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def fetch_api_raw_sync():
    headers = {
        "Authorization": f"Bearer {API_BEARER_TOKEN}",
        "Accept": "application/json",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }
    session = requests.Session()
    session.trust_env = False
    response = session.get(API_URL, headers=headers, verify=False, timeout=12)
    return response

async def fetch_api_raw():
    return fetch_api_raw_sync()

async def fetch_gold_prices() -> dict | list | None:
    try:
        response = fetch_api_raw_sync()
        if response.status_code == 200:
            return response.json()
        logging.error(f"API Error {response.status_code}: {response.text}")
        return None
    except Exception as e:
        logging.error(f"HTTP Exception: {e}")
        return None

def normalize_price(value):
    if value is None or str(value).strip() in ["-", "", "None", "0"]:
        return None
    try:
        clean_val = str(value).replace(",", "").strip()
        val_float = float(clean_val)
        if val_float <= 0:
            return None
        return int(val_float)
    except (ValueError, TypeError):
        return None

def format_number(val_int):
    if not val_int or val_int <= 0:
        return "-"
    return f"{val_int:,}"

def parse_prices(data: dict | list | None) -> dict:
    parsed = {
        "gold_18": "-",
        "coin_emami": "-",
        "coin_half": "-",
        "coin_quarter": "-"
    }
    if not data:
        return parsed

    all_symbols = []
    if isinstance(data, dict):
        if "groups" in data and isinstance(data["groups"], list):
            for group in data["groups"]:
                if "symbols" in group and isinstance(group["symbols"], list):
                    all_symbols.extend(group["symbols"])
        elif "symbols" in data and isinstance(data["symbols"], list):
            all_symbols.extend(data["symbols"])
        else:
            all_symbols.append(data)
    elif isinstance(data, list):
        all_symbols.extend(data)

    candidates = {
        "gold_18": [],
        "coin_emami": [],
        "coin_half": [],
        "coin_quarter": []
    }

    for item in all_symbols:
        if not isinstance(item, dict):
            continue

        name = str(item.get("name", "")).strip().replace("ي", "ی").replace("ك", "ک")
        price_num = normalize_price(item.get("price"))
        if not price_num:
            continue

        # طلای ۱۸ عیار
        if ("گرم 18" in name or "گرم ۱۸" in name or "طلای 18" in name or "18 عیار" in name) and "مبنا" not in name:
            candidates["gold_18"].append((name, price_num))
        elif ("گرم 18" in name or "گرم ۱۸" in name):
            candidates["gold_18"].append((name, price_num))

        # سکه امامی (طرح جدید)
        elif ("امامی" in name or "طرح جدید" in name or name in ["سکه", "تمام سکه", "سکه تمام نقدی"]) and "نیم" not in name and "ربع" not in name and "گرمی" not in name:
            candidates["coin_emami"].append((name, price_num))

        # نیم سکه
        elif "نیم" in name and ("سکه" in name or "بهار" in name):
            candidates["coin_half"].append((name, price_num))

        # ربع سکه
        elif "ربع" in name and ("سکه" in name or "بهار" in name):
            candidates["coin_quarter"].append((name, price_num))

    for key, items in candidates.items():
        if not items:
            continue
        
        naghdi_item = next((p for n, p in items if "نقدی" in n or "نقد" in n), None)
        if naghdi_item:
            selected_price = naghdi_item
        else:
            selected_price = max(p for n, p in items)

        parsed[key] = format_number(selected_price)

    return parsed

def generate_price_message(prices: dict) -> str:
    now = jdatetime.datetime.now()
    date_str = now.strftime("%Y/%m/%d")
    time_str = now.strftime("%H:%M:%S")
    ad_text = get_setting("ad_text")

    return (
        f"بروز رسانی : {date_str} | {time_str}\n\n"
        f"🥇 طلا:\n"
        f"طلای ۱۸ عیار: {prices['gold_18']}\n"
        f"قیمت خرید لحظه‌ای طلا از سایت زرین قسط\n"
        f"پنل خرید قسطی طلا بهترین فرصت برای سرمایه‌گذاری\n\n"
        f"💰 سکه:\n"
        f"سکه امامی: {prices['coin_emami']}\n"
        f"نیم سکه: {prices['coin_half']}\n"
        f"ربع سکه: {prices['coin_quarter']}\n\n"
        f"{ad_text}"
    )