import json
import os

from fastapi import APIRouter
from fastapi.responses import JSONResponse
from pydantic import BaseModel

# Import 2 module gốc của Phòng ban Learning Agent
from agent.feedback_agent.langfuse_puller import langfuse_puller
from agent.feedback_agent.learning_loop import run_optimization_logic

router = APIRouter(prefix="/api/feedback-agent", tags=["Learning Agent"])

RULES_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../worker/fashion_rules.json")

class ApplyRuleRequest(BaseModel):
    new_rules_json: str

@router.get("/sync-langfuse")
async def sync_langfuse_feedbacks():
    """ 
    Kéo bad feedbacks thủ công từ Langfuse về xem chơi. 
    Dành cho View ở trang Admin (HTML).
    """
    feedbacks = langfuse_puller.fetch_bad_feedbacks(limit=5)
    return JSONResponse(status_code=200, content={"status": "success", "data": feedbacks})

@router.post("/analyze")
async def analyze_feedbacks():
    """ 
    Bắt con LLM học và chỉnh sửa file Rules hiện tại. 
    Trả về File Cu - Mới để UI Admin Review (không ghi đè File ngay). 
    """
    feedbacks = langfuse_puller.fetch_bad_feedbacks()
    
    # 1. Đọc não bộ hiện tại (JSON)
    current_rule_str = "{}"
    if os.path.exists(RULES_PATH):
        try:
            with open(RULES_PATH, "r", encoding="utf-8") as f:
                current_rule_str = f.read()
        except Exception as e:
            pass

    # 2. Bắt con LLM suy luận học hỏi
    draft_rule_str = run_optimization_logic(feedbacks, current_rule_str)
    
    # 3. Trả về nháp cho Admin Compare
    return JSONResponse(status_code=200, content={
        "status": "success", 
        "draft_json": draft_rule_str,
        "old_json": current_rule_str,
        "feedbacks": feedbacks
    })

@router.post("/apply")
async def apply_new_rules(req: ApplyRuleRequest):
    """ 
    Cho phép Admin Confirm bản Cập nhật mới mà LLM đề xuất.
    Ghi đè trực tiếp lên fashion_rules.json -> Hoàn tất vòng chạy Tự học!
    """
    try:
        # Check an toàn: Parse lại nếu LLM nhả rác (không phải JSON)
        parsed = json.loads(req.new_rules_json)
        
        # Ghi đè vào Rule hệ thống
        with open(RULES_PATH, "w", encoding="utf-8") as f:
            json.dump(parsed, f, ensure_ascii=False, indent=4)
            
        return {"status": "success", "message": "Updated fashion_rules.json successfully."}
    except json.JSONDecodeError:
        return JSONResponse(status_code=400, content={"status": "error", "message": "Feedback Agent nhả ra chuỗi không phải File JSON chuẩn!"})
    except Exception as e:
        return JSONResponse(status_code=500, content={"status": "error", "message": str(e)})
