import os
import pandas as pd
from sqlalchemy.ext.asyncio import AsyncSession
from database.product_crud import upsert_category, upsert_product
from database.models import Category


def get_category_by_product_name(name: str) -> tuple[str, str | None]:
    """
    تشخیص دسته‌بندی بر اساس نام محصول.
    Returns: (sub_category_name, parent_category_name or None)
    """
    name_lower = name.lower()

    # ─── ردیم کد / گیفت کارت ───────────────────────────────
    if any(k in name_lower for k in ["ردیم", "redeem", "gift card", "giftcard", "گیفت کارت"]):
        return "ردیم کد", None

    # ─── کال اف موبایل ──────────────────────────────────────
    if any(k in name_lower for k in ["cp کال", "cp call", "کال اف", "کالاف", "call of duty", " cp ", "cod", "سی پی", "سی‌پی"]):
        return "CP کال اف موبایل", "کال اف موبایل"

    # ─── پابجی: پرایم ───────────────────────────────────────
    if any(k in name_lower for k in ["پرایم", "پریام", "prime"]):
        return "پرایم ها", "پابجی موبایل"

    # ─── پابجی: گروث پک ─────────────────────────────────────
    if any(k in name_lower for k in ["pack", "پک", "emblem", "گروث", "growth", "first purchase", "materials", "mythic", "میتیک", "فورج"]):
        return "گروث پک ها", "پابجی موبایل"

    # ─── پابجی: یوسی لاگین ──────────────────────────────────
    if "لاگین" in name_lower or "login" in name_lower:
        return "یوسی لاگین", "پابجی موبایل"

    # ─── پابجی: یوسی عادی ───────────────────────────────────
    if any(k in name_lower for k in ["یوسی", "uc", "پابجی", "pubg"]):
        return "یوسی", "پابجی موبایل"

    # ─── پیش‌فرض: زیردسته نامشخص ────────────────────────────
    return "سایر", None


async def get_or_create_category_with_parent(
    session: AsyncSession, sub_name: str, parent_name: str | None
) -> Category:
    """
    ایجاد یا یافتن دسته‌بندی با در نظر گرفتن ساختار والد/فرزند.
    """
    sub_name = sub_name.strip()

    if parent_name:
        parent = await upsert_category(session, parent_name.strip(), parent_id=None)
        return await upsert_category(session, sub_name, parent_id=parent.id)
    else:
        return await upsert_category(session, sub_name, parent_id=None)


async def import_products_from_excel(session: AsyncSession, file_path: str) -> dict:
    """
    خواندن فایل اکسل یا CSV و ثبت دسته‌بندی‌ها و محصولات.
    پشتیبانی از فرمت‌های:
      - CSV سفارشی سایت (شناسه | نام | منتشر شده | در انبار؟ | قیمت فروش ویژه | قیمت عادی)
      - CSV استاندارد (Name | Category | Price ...)
      - اکسل با شیت Product
      - اکسل استاندارد (Name | Category | Price ...)
    """
    try:
        ext = os.path.splitext(file_path)[1].lower()
        is_csv = (ext == '.csv')
        added_count = 0

        # ─── پیش‌ساخت دسته‌بندی‌های اصلی ───────────────────
        for top_cat in ["پابجی موبایل", "کال اف موبایل", "ردیم کد"]:
            await upsert_category(session, top_cat, parent_id=None)

        # ─── CSV ─────────────────────────────────────────────
        if is_csv:
            encodings = ['utf-8-sig', 'utf-8', 'windows-1256']
            df = None
            for enc in encodings:
                try:
                    df = pd.read_csv(file_path, encoding=enc)
                    break
                except Exception:
                    continue
            if df is None:
                return {"status": "error", "message": "قادر به خواندن فایل CSV با انکودینگ‌های استاندارد نبودیم."}

            # فرمت سفارشی سایت: شناسه | نام | منتشر شده | در انبار؟ | قیمت فروش ویژه | قیمت عادی
            if 'نام' in df.columns and ('قیمت عادی' in df.columns or 'قیمت فروش ویژه' in df.columns):
                price_col = 'قیمت عادی' if 'قیمت عادی' in df.columns else 'قیمت فروش ویژه'

                for _, row in df.iterrows():
                    prod_name = row.get('نام')
                    if pd.isna(prod_name) or str(prod_name).strip() == "":
                        continue
                    prod_name = str(prod_name).strip()

                    # قیمت: اولویت با قیمت ویژه
                    special_price = row.get('قیمت فروش ویژه')
                    price_val = row.get(price_col, 0)
                    price = 0.0
                    if pd.notna(special_price) and str(special_price).strip() != "":
                        try:
                            price = float(str(special_price).replace(",", ""))
                        except Exception:
                            pass
                    if price == 0.0:
                        try:
                            price = float(str(price_val).replace(",", "")) if pd.notna(price_val) else 0.0
                        except Exception:
                            price = 0.0

                    sub_cat, parent_cat = get_category_by_product_name(prod_name)
                    category = await get_or_create_category_with_parent(session, sub_cat, parent_cat)
                    await upsert_product(
                        session=session,
                        category_id=category.id,
                        name=prod_name,
                        price=price,
                        description="",
                        stock=-1
                    )
                    added_count += 1

                return {"status": "success", "count": added_count, "format": "custom_csv"}

            # فرمت استاندارد CSV: Name | Category | Price
            if 'Name' in df.columns and ('Price' in df.columns or 'Sell Toman' in df.columns):
                price_col = 'Price' if 'Price' in df.columns else 'Sell Toman'

                for _, row in df.iterrows():
                    prod_name = str(row.get('Name', '')).strip()
                    if not prod_name or pd.isna(row.get('Name')):
                        continue

                    # دسته‌بندی: اگر ستون Category وجود داشت از آن، وگرنه تشخیص خودکار
                    cat_val = row.get('Category')
                    if pd.notna(cat_val) and str(cat_val).strip():
                        sub_cat = str(cat_val).strip()
                        parent_cat = None
                    else:
                        sub_cat, parent_cat = get_category_by_product_name(prod_name)

                    price_val = row.get(price_col, 0)
                    try:
                        price = float(str(price_val).replace(",", ""))
                    except Exception:
                        price = 0.0

                    description = str(row.get('Description', '')) if pd.notna(row.get('Description', None)) else ""
                    stock = int(row.get('Stock', -1)) if pd.notna(row.get('Stock', None)) else -1

                    category = await get_or_create_category_with_parent(session, sub_cat, parent_cat)
                    await upsert_product(
                        session=session,
                        category_id=category.id,
                        name=prod_name,
                        price=price,
                        description=description,
                        stock=stock
                    )
                    added_count += 1

                return {"status": "success", "count": added_count, "format": "standard_csv"}

            return {"status": "error", "message": "ستون‌های فایل CSV با هیچ‌کدام از فرمت‌های استاندارد یا سفارشی مطابقت ندارد."}

        # ─── EXCEL ───────────────────────────────────────────
        else:
            xl = pd.ExcelFile(file_path)
            sheet_names = xl.sheet_names

            # شیت اختصاصی Product
            if 'Product' in sheet_names:
                df = pd.read_excel(file_path, sheet_name='Product')
                required_cols = ['Product Name', 'Sell Toman']
                if all(col in df.columns for col in required_cols):
                    current_category_raw = "یوسی"
                    for _, row in df.iterrows():
                        cat_val = row.get('Product')
                        if pd.notna(cat_val) and str(cat_val).strip():
                            current_category_raw = str(cat_val).strip()

                        prod_name = row.get('Product Name')
                        if pd.isna(prod_name) or str(prod_name).strip() == "":
                            continue
                        prod_name = str(prod_name).strip()

                        price_val = row.get('Sell Toman')
                        try:
                            price = float(str(price_val).replace(",", "")) if pd.notna(price_val) else 0.0
                        except Exception:
                            price = 0.0

                        sub_cat, parent_cat = get_category_by_product_name(prod_name)
                        # اگر تشخیص خودکار ناموفق بود، از مقدار ستون استفاده کن
                        if sub_cat == "سایر":
                            sub_cat = current_category_raw
                            parent_cat = None

                        category = await get_or_create_category_with_parent(session, sub_cat, parent_cat)
                        await upsert_product(
                            session=session,
                            category_id=category.id,
                            name=prod_name,
                            price=price,
                            description="",
                            stock=-1
                        )
                        added_count += 1

                    return {"status": "success", "count": added_count, "format": "custom_excel"}

            # اکسل استاندارد
            df = pd.read_excel(file_path)
            if 'Name' in df.columns and ('Price' in df.columns or 'Sell Toman' in df.columns):
                price_col = 'Price' if 'Price' in df.columns else 'Sell Toman'
                for _, row in df.iterrows():
                    prod_name = str(row.get('Name', '')).strip()
                    if not prod_name or pd.isna(row.get('Name')):
                        continue

                    cat_val = row.get('Category')
                    if pd.notna(cat_val) and str(cat_val).strip():
                        sub_cat = str(cat_val).strip()
                        parent_cat = None
                    else:
                        sub_cat, parent_cat = get_category_by_product_name(prod_name)

                    price_val = row.get(price_col, 0)
                    try:
                        price = float(str(price_val).replace(",", ""))
                    except Exception:
                        price = 0.0

                    description = str(row.get('Description', '')) if pd.notna(row.get('Description', None)) else ""
                    stock = int(row.get('Stock', -1)) if pd.notna(row.get('Stock', None)) else -1

                    category = await get_or_create_category_with_parent(session, sub_cat, parent_cat)
                    await upsert_product(
                        session=session,
                        category_id=category.id,
                        name=prod_name,
                        price=price,
                        description=description,
                        stock=stock
                    )
                    added_count += 1

                return {"status": "success", "count": added_count, "format": "standard_excel"}

            return {"status": "error", "message": "ستون‌های فایل اکسل با هیچ‌کدام از فرمت‌های استاندارد یا سفارشی مطابقت ندارد."}

    except Exception as e:
        return {"status": "error", "message": str(e)}
