import logging
import os
from pathlib import Path
from threading import Thread
from urllib.parse import quote, unquote, urlparse

import requests
from dotenv import load_dotenv

load_dotenv()

logger = logging.getLogger("ai_visual_helper")

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DESIGN_DIR = os.getenv("DESIGN_DIR", os.path.join(BASE_DIR, "design"))
AI_SERVICE_URL = os.getenv("AI_SERVICE_URL", "http://127.0.0.1:8001").rstrip("/")


def extract_design_file_name(value: str) -> str:
    raw = str(value or "").strip()
    if not raw:
        return ""

    if raw.startswith("http://") or raw.startswith("https://"):
        path = urlparse(raw).path
    else:
        path = raw

    return os.path.basename(unquote(path))


def search_image_file(image_bytes: bytes, filename: str, content_type: str = "image/png") -> dict:
    files = {
        "file": (
            filename or "query.png",
            image_bytes,
            content_type or "image/png",
        )
    }

    response = requests.post(
        f"{AI_SERVICE_URL}/search-image",
        files=files,
        timeout=90,
    )
    response.raise_for_status()
    return response.json()


def _queue_index_design_file(file_name: str) -> None:
    try:
        response = requests.post(
            f"{AI_SERVICE_URL}/queue-index/{quote(file_name)}",
            timeout=10,
        )
        response.raise_for_status()
    except Exception as exc:
        logger.warning("AI queue-index failed for %s: %s", file_name, exc)


def index_design_file(design_value: str) -> bool:
    """Đưa file vào hàng chờ FIFO để AI học nền, trả về ngay không chờ."""
    file_name = extract_design_file_name(design_value)
    if not file_name:
        return False

    Thread(
        target=_queue_index_design_file,
        args=(file_name,),
        daemon=True,
        name=f"ai-queue-index-{file_name[:32]}",
    ).start()
    return True


def delete_design_file(design_value: str) -> bool:
    file_name = extract_design_file_name(design_value)
    if not file_name:
        return False

    deleted_ok = False

    try:
        response = requests.delete(
            f"{AI_SERVICE_URL}/delete-product/{quote(file_name)}",
            timeout=30,
        )
        response.raise_for_status()
        deleted_ok = True
    except Exception as exc:
        logger.warning("AI delete failed for %s: %s", file_name, exc)

    # Fallback: nếu AI chưa xoá file thì BE tự xoá file trong folder design.
    try:
        file_path = os.path.join(DESIGN_DIR, file_name)
        if os.path.exists(file_path):
            os.remove(file_path)
        deleted_ok = True
    except Exception as exc:
        logger.warning("Local design file delete failed for %s: %s", file_name, exc)

    return deleted_ok
