from fastapi import APIRouter, Depends, HTTPException, Body
from typing import List, Dict, Any
from idg_models import IDGThemeSetting, IDGWidgetBlock, IDGWidgetCache, IDGLayoutBlock, IDGMenuItem, IDGAdminLog
from datetime import datetime, timezone
import uuid

def build_idg_core_router(db, get_current_user, require_admin, now_iso):
    router = APIRouter(prefix="/admin/api", tags=["IDG Core Integration"])
    
    # ---------------- THEME SETTINGS ----------------
    @router.get("/idg-theme-settings")
    async def get_theme_settings(user = Depends(require_admin)):
        settings = await db.idg_theme_settings.find({}, {"_id": 0}).to_list(1000)
        return {"status": "ok", "settings": settings}
        
    @router.post("/idg-theme-settings/save")
    async def save_theme_settings(payload: Dict[str, str], user = Depends(require_admin)):
        for key, value in payload.items():
            await db.idg_theme_settings.update_one(
                {"key": key},
                {"$set": {"value": value, "updatedAt": datetime.now(timezone.utc)}},
                upsert=True
            )
        await db.idg_admin_logs.insert_one(IDGAdminLog(
            action="update_theme_settings",
            adminId=user["username"],
            details={"keys_updated": list(payload.keys())}
        ).model_dump())
        return {"status": "ok", "message": "Theme settings saved"}

    # ---------------- EXTERNAL WIDGETS ----------------
    @router.get("/idg-widgets")
    async def get_widgets(user = Depends(require_admin)):
        widgets = await db.idg_widget_blocks.find({}, {"_id": 0}).sort("position", 1).to_list(100)
        return {"status": "ok", "widgets": widgets}
        
    @router.post("/idg-widgets/save")
    async def save_widget(widget: IDGWidgetBlock, user = Depends(require_admin)):
        widget_dict = widget.model_dump()
        widget_dict["updatedAt"] = datetime.now(timezone.utc)
        await db.idg_widget_blocks.update_one(
            {"blockKey": widget.blockKey},
            {"$set": widget_dict},
            upsert=True
        )
        # Clear cache for this widget
        await db.idg_widget_cache.delete_many({"blockKey": widget.blockKey})
        
        await db.idg_admin_logs.insert_one(IDGAdminLog(
            action="save_widget",
            adminId=user["username"],
            details={"blockKey": widget.blockKey}
        ).model_dump())
        return {"status": "ok", "message": "Widget saved and cache cleared"}

    @router.post("/idg-widgets/order")
    async def order_widgets(payload: List[Dict[str, Any]], user = Depends(require_admin)):
        # payload is list of {"blockKey": "...", "position": 0}
        for item in payload:
            await db.idg_widget_blocks.update_one(
                {"blockKey": item["blockKey"]},
                {"$set": {"position": item.get("position", 0)}}
            )
        await db.idg_admin_logs.insert_one(IDGAdminLog(
            action="reorder_widgets",
            adminId=user["username"]
        ).model_dump())
        return {"status": "ok", "message": "Widgets reordered"}

    # ---------------- LAYOUT BUILDER ----------------
    @router.post("/idg-layout/save")
    async def save_layout(payload: List[IDGLayoutBlock], user = Depends(require_admin)):
        # Clear existing layout for the page/area combinations
        if payload:
            pages = list(set([p.page for p in payload]))
            await db.idg_layout_blocks.delete_many({"page": {"$in": pages}})
            await db.idg_layout_blocks.insert_many([p.model_dump() for p in payload])
            
        await db.idg_admin_logs.insert_one(IDGAdminLog(
            action="save_layout",
            adminId=user["username"],
            details={"blocks_count": len(payload)}
        ).model_dump())
        return {"status": "ok", "message": "Layout saved"}

    # ---------------- MENU BUILDER ----------------
    @router.post("/idg-menu/order")
    async def order_menus(payload: List[IDGMenuItem], user = Depends(require_admin)):
        # Overwrite all menus
        await db.idg_menu_items.delete_many({})
        if payload:
            await db.idg_menu_items.insert_many([m.model_dump() for m in payload])
            
        await db.idg_admin_logs.insert_one(IDGAdminLog(
            action="order_menus",
            adminId=user["username"]
        ).model_dump())
        return {"status": "ok", "message": "Menus updated"}

    return router

def build_idg_external_router(db):
    router = APIRouter(prefix="/api", tags=["IDG External Widgets"])
    
    @router.get("/idg-external")
    async def get_external_widgets():
        # Public endpoint for external widgets iframe
        # In a real app, this would return the generated HTML based on active widgets
        # For now we'll just return a list of active widget blocks
        widgets = await db.idg_widget_blocks.find({"active": True}, {"_id": 0}).sort("position", 1).to_list(100)
        
        # Usually it returns actual HTML or JSON to be injected by idg-external-widgets.js
        return {"status": "ok", "widgets": widgets}
        
    return router
