import asyncio
import json
import logging
import sys
import os

# Ensure the root backend directory is in the path so imports work
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from common.pool_wrapper import get_pooled_connection_compat
from api.product_desc.bulk_ops_route import _render_description_text, _call_codex

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", datefmt="%y-%m-%d %H:%M:%S")
logger = logging.getLogger("size_guide_generator")

PG_TABLE = "dashboard_canifa.ultra_descriptions"
TARGET_FIELD = "huong_dan_size"

async def generate_size_guide(code_or_line: str, raw_size_table: str, by_product_line: bool = False):
    """
    Sinh Hướng dẫn chọn size từ bản thô và thông tin SP, lưu thẳng vào database.
    """
    conn = None
    cur = None
    try:
        conn = get_pooled_connection_compat()
        cur = conn.cursor()
        
        if by_product_line:
            cur.execute(f"SELECT internal_ref_code, product_name, product_line, description_data FROM {PG_TABLE} WHERE product_line = %s", (code_or_line,))
        else:
            cur.execute(f"SELECT internal_ref_code, product_name, product_line, description_data FROM {PG_TABLE} WHERE internal_ref_code = %s", (code_or_line,))
            
        rows = cur.fetchall()
        if not rows:
            logger.error(f"❌ Không tìm thấy sản phẩm với {'product_line' if by_product_line else 'mã'} = {code_or_line}")
            return
            
        logger.info(f"🔍 Tìm thấy {len(rows)} sản phẩm. Đang xử lý AI...")
        
        for row in rows:
            code, name, p_line, desc_data = row
            
            if isinstance(desc_data, str):
                try: desc_data = json.loads(desc_data)
                except: desc_data = {}
            elif desc_data is None:
                desc_data = {}
                
            current_value = desc_data.get(TARGET_FIELD, "")
            
            context_fields = {
                "ten_san_pham": desc_data.get("ten_san_pham", name or ""),
                "phong_cach": desc_data.get("phong_cach", ""),
                "chat_lieu": desc_data.get("chat_lieu", ""),
                "gioi_tinh": desc_data.get("gioi_tinh", ""),
                "mua": desc_data.get("mua", ""),
                "do_tuoi": desc_data.get("do_tuoi", ""),
                "product_line": p_line or "",
            }
            context_str = "\n".join(f"- {k}: {v}" for k, v in context_fields.items() if v)
            
            prompt = f"""Bạn là Stylist thời trang chuyên nghiệp của Canifa. Dựa trên thông tin sản phẩm và Bảng thông số size (được cung cấp trong YÊU CẦU), hãy sinh ra đoạn văn bản Hướng dẫn chọn size tự nhiên, có tâm và chính xác.

THÔNG TIN SẢN PHẨM:
{context_str}

YÊU CẦU (Chứa bảng size thô / hướng dẫn custom):
{raw_size_table}

QUY TẮC BẮT BUỘC ('Hướng dẫn chọn size'):
- LIỆT KÊ các size có sẵn dựa trên bảng thông số.
- ĐƯA RA LỜI KHUYÊN DỄ HIỂU (Ví dụ: Bạn cao 170cm, nặng 65kg -> nên chọn size M).
- TIPS MẶC ĐẸP: Dựa vào "phong cách", "chất liệu", "độ tuổi", "giới tính" để khuyên phù hợp (VD: Slim fit nên khuyên tăng size nếu thích thoải mái, Oversize thì khuyên giữ nguyên).
- FORMAT RÕ RÀNG: Dùng bullet point hoặc gạch đầu dòng dễ đọc. Trình bày cả bảng thông số chi tiết từ YÊU CẦU một cách đẹp mắt.
- Trả về chỉ nội dung trường, KHÔNG giải thích.
"""
            messages = [
                {"role": "system", "content": "Bạn là AI phụ trách nội dung sản phẩm thời trang Canifa."},
                {"role": "user", "content": prompt},
            ]
            
            ai_output = await _call_codex(messages, max_tokens=600, temperature=0.7)
            new_value = ai_output.strip().strip('"').strip("'")
            
            desc_data[TARGET_FIELD] = new_value
            new_clean = _render_description_text(desc_data, name or "")
            
            cur.execute(
                f"UPDATE {PG_TABLE} SET description_data = %s::jsonb, clean_description = %s, updated_at = NOW() WHERE internal_ref_code = %s",
                (json.dumps(desc_data, ensure_ascii=False), new_clean, code)
            )
            conn.commit()
            
            logger.info(f"✅ Đã gen xong Hướng dẫn size cho {code}")
            
    except Exception as e:
        logger.error(f"❌ Lỗi: {e}")
        if conn: conn.rollback()
    finally:
        if cur: cur.close()
        if conn: conn.close()

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Sử dụng: python size_guide_generator.py <internal_ref_code|product_line> <file_chứa_bảng_size.txt> [--line]")
        print("Thêm cờ --line ở cuối nếu tham số đầu tiên là mã product_line thay vì ref_code.")
        sys.exit(1)
        
    code_input = sys.argv[1]
    file_path = sys.argv[2]
    is_line = len(sys.argv) >= 4 and sys.argv[3] == "--line"
    
    if not os.path.exists(file_path):
        print(f"File {file_path} không tồn tại!")
        sys.exit(1)
        
    with open(file_path, "r", encoding="utf-8") as f:
        size_table_content = f.read()
        
    logger.info(f"Bắt đầu quy trình gen size guide cho {code_input}...")
    asyncio.run(generate_size_guide(code_input, size_table_content, is_line))
