# app/modules/cms/routes/pages/storefront.py
"""
CMS Storefront Page Routes (HTML rendering).

Storefront (customer shop) pages for CMS content:
- Generic content pages (/{slug} catch-all)
- Debug context endpoint
"""

import logging

from fastapi import APIRouter, Depends, HTTPException, Path, Request
from fastapi.responses import HTMLResponse
from sqlalchemy.orm import Session

from app.api.deps import get_db
from app.modules.cms.services import content_page_service
from app.modules.core.utils.page_context import get_storefront_context
from app.templates_config import templates

logger = logging.getLogger(__name__)

router = APIRouter()

# Route configuration - high priority so catch-all is registered last
ROUTE_CONFIG = {
    "priority": 100,
}


# ============================================================================
# DYNAMIC CONTENT PAGES (CMS)
# ============================================================================


@router.get("/{slug}", response_class=HTMLResponse, include_in_schema=False)
async def generic_content_page(
    request: Request,
    slug: str = Path(..., description="Content page slug"),
    db: Session = Depends(get_db),
):
    """
    Generic content page handler (CMS).

    Handles dynamic content pages like:
    - /about, /faq, /contact, /shipping, /returns, /privacy, /terms, etc.

    Features:
    - Two-tier system: Vendor overrides take priority, fallback to platform defaults
    - Only shows published pages
    - Returns 404 if page not found

    This route MUST be defined last in the router to avoid conflicts with
    specific routes (like /products, /cart, /account, etc.)
    """
    logger.debug(
        "[CMS_STOREFRONT] generic_content_page REACHED",
        extra={
            "path": request.url.path,
            "slug": slug,
            "vendor": getattr(request.state, "vendor", "NOT SET"),
            "context": getattr(request.state, "context_type", "NOT SET"),
        },
    )

    vendor = getattr(request.state, "vendor", None)
    platform = getattr(request.state, "platform", None)
    vendor_id = vendor.id if vendor else None
    platform_id = platform.id if platform else 1  # Default to OMS

    # Load content page from database (vendor override -> vendor default)
    page = content_page_service.get_page_for_vendor(
        db,
        platform_id=platform_id,
        slug=slug,
        vendor_id=vendor_id,
        include_unpublished=False,
    )

    if not page:
        logger.warning(
            "[CMS_STOREFRONT] Content page not found",
            extra={
                "slug": slug,
                "vendor_id": vendor_id,
                "vendor_name": vendor.name if vendor else None,
            },
        )
        raise HTTPException(status_code=404, detail=f"Page not found: {slug}")

    logger.info(
        "[CMS_STOREFRONT] Content page found",
        extra={
            "slug": slug,
            "page_id": page.id,
            "page_title": page.title,
            "is_vendor_override": page.vendor_id is not None,
            "vendor_id": vendor_id,
        },
    )

    return templates.TemplateResponse(
        "cms/storefront/content-page.html",
        get_storefront_context(request, db=db, page=page),
    )


# ============================================================================
# DEBUG ENDPOINTS - For troubleshooting context issues
# ============================================================================


@router.get("/debug/context", response_class=HTMLResponse, include_in_schema=False)
async def debug_context(request: Request):
    """
    DEBUG ENDPOINT: Display request context.

    Shows what's available in request.state.
    Useful for troubleshooting template variable issues.

    URL: /storefront/debug/context
    """
    import json

    vendor = getattr(request.state, "vendor", None)
    theme = getattr(request.state, "theme", None)

    debug_info = {
        "path": request.url.path,
        "host": request.headers.get("host", ""),
        "vendor": {
            "found": vendor is not None,
            "id": vendor.id if vendor else None,
            "name": vendor.name if vendor else None,
            "subdomain": vendor.subdomain if vendor else None,
            "is_active": vendor.is_active if vendor else None,
        },
        "theme": {
            "found": theme is not None,
            "name": theme.get("theme_name") if theme else None,
        },
        "clean_path": getattr(request.state, "clean_path", "NOT SET"),
        "context_type": str(getattr(request.state, "context_type", "NOT SET")),
    }

    html_content = f"""
    <!DOCTYPE html>
    <html>
    <head>
        <title>Debug Context</title>
        <style>
            body {{ font-family: monospace; margin: 20px; }}
            pre {{ background: #f0f0f0; padding: 20px; border-radius: 5px; }}
            .good {{ color: green; }}
            .bad {{ color: red; }}
        </style>
    </head>
    <body>
        <h1>Request Context Debug</h1>
        <pre>{json.dumps(debug_info, indent=2)}</pre>

        <h2>Status</h2>
        <p class="{"good" if vendor else "bad"}">
            Vendor: {"Found" if vendor else "Not Found"}
        </p>
        <p class="{"good" if theme else "bad"}">
            Theme: {"Found" if theme else "Not Found"}
        </p>
        <p class="{"good" if str(getattr(request.state, "context_type", "NOT SET")) == "storefront" else "bad"}">
            Context Type: {str(getattr(request.state, "context_type", "NOT SET"))}
        </p>
    </body>
    </html>
    """
    return HTMLResponse(content=html_content)
