"""Small standalone HTTP boundary for the Brand VEIL generation service.

This exposes only the Brand Fusion Lab service. The full IA ARTE VEIL web app
is not started or mounted here; its reusable generation modules are loaded as
the current implementation source until the extraction is completed.
"""

import os
import sys
from pathlib import Path

from fastapi import FastAPI, HTTPException
from fastapi.responses import FileResponse


ROOT = Path(__file__).parent
SOURCE_DIR = Path(os.getenv("BRAND_VEIL_SOURCE_DIR", ROOT.parent / "ia_arte_veil")).resolve()
DATA_DIR = Path(os.getenv("BRAND_VEIL_DATA_DIR", ROOT / "data" / "brand_veil")).resolve()
GENERATED_DIR = DATA_DIR / "generated"
METADATA_DIR = DATA_DIR / "metadata"
ARCHIVED_METADATA_DIR = DATA_DIR / "archived_metadata"

if str(SOURCE_DIR) not in sys.path:
    sys.path.insert(0, str(SOURCE_DIR))

from brand_fusion_lab import BrandFusionLabService  # noqa: E402
from models import ArtworkGenerationRequest  # noqa: E402


app = FastAPI(title="Brand VEIL API", version="0.1.0")
SIZE_PRESETS = [
    {"id": "square_512", "name": "Quadrado 512 × 512", "width": 512, "height": 512, "active": True},
    {"id": "square_768", "name": "Quadrado 768 × 768", "width": 768, "height": 768, "active": True},
    {"id": "square_1024", "name": "Quadrado 1024 × 1024", "width": 1024, "height": 1024, "active": True},
]
FRAME_PRESETS = [
    {"id": "safe_frame_v1", "name": "Quadro seguro", "description": "Conteúdo contido no canvas", "version": "1.0", "active": True},
    {"id": "soft_frame_v1", "name": "Borda suave", "description": "Cantos arredondados e margem visual", "version": "1.0", "active": True},
]
service = BrandFusionLabService(
    generated_dir=GENERATED_DIR,
    metadata_dir=METADATA_DIR,
    archived_metadata_dir=ARCHIVED_METADATA_DIR,
    default_artist=os.getenv("BRAND_VEIL_ARTIST", "Brand VEIL"),
)


@app.get("/api/health")
def health():
    return {"status": "ok", "service": "brand-veil", "source": str(SOURCE_DIR)}


@app.get("/api/presets")
def presets():
    items = service.list_presets().model_dump(mode="json")["items"]
    normalized = [{**item, "id": item["preset_id"], "name": item["label"], "version": "1.0", "active": True} for item in items]
    return {"engine": "brand-veil", "version": "0.1.0", "presets": normalized, "frames": FRAME_PRESETS, "sizes": SIZE_PRESETS}


@app.get("/api/capabilities")
def capabilities():
    return {"engine": "brand-veil", "version": "0.1.0", "features": ["generation", "batch", "brand-signature", "certification", "persistent-library", "multiple-canvas-sizes"], "presets": presets()["presets"], "frames": FRAME_PRESETS, "sizes": SIZE_PRESETS}


@app.post("/api/generate")
def generate(payload: dict):
    """Generate through a small normalized contract shared with TRITRÓIA."""
    try:
        request = ArtworkGenerationRequest(
            artist_name=payload.get("artistName") or payload.get("artist_name") or "Brand VEIL",
            title_hint=payload.get("prompt") or payload.get("titleHint"),
            theme_hint=payload.get("prompt") or payload.get("themeHint"),
            batch_count=max(1, min(9, int(payload.get("quantity", payload.get("batchCount", 1))))),
            canvas_size=next((item["width"] for item in SIZE_PRESETS if item["id"] == payload.get("sizePreset")), 768),
            brand_preset_id=payload.get("preset") or payload.get("brandPresetId"),
            brand_profile_id=payload.get("brandProfileId"),
            brand_mark_enabled=bool(payload.get("brandMarkEnabled", False)),
            brand_mark_text=payload.get("brandMarkText"),
            brand_mark_image_path=payload.get("brandMarkImagePath"),
            generate_birth_animation=bool(payload.get("generateBirthAnimation", False)),
            randomness_boost=float(payload.get("randomnessBoost", 0.7)),
            palette_flux=float(payload.get("paletteFlux", 0.7)),
            composition_drift=float(payload.get("compositionDrift", 0.7)),
            texture_noise=float(payload.get("textureNoise", 0.7)),
        )
        batch = service.generate_batch(request)
        entropy_token = str(payload.get("entropyToken", ""))[:128]
        assets = []
        for item in batch.items:
            assets.append({
                "id": item.artwork_id,
                "imageUrl": f"/api/artworks/{item.artwork_id}/image",
                "imageHash": item.certificate.execution_hash,
                "certificate": item.certificate.model_dump(mode="json"),
                "manifest": item.manifest.model_dump(mode="json"),
                "framePreset": payload.get("framePreset", "safe_frame_v1"),
                "sizePreset": payload.get("sizePreset", "square_768"),
                "entropyDigest": entropy_token or None,
                "entropySource": "tritroia-sdk" if entropy_token else "brand-veil-local",
            })
        return {"status": "created", "engine": "brand-veil", "assets": assets, "asset": assets[0]}
    except (TypeError, ValueError) as error:
        raise HTTPException(status_code=422, detail=str(error)) from error
    except Exception as error:
        raise HTTPException(status_code=500, detail="brand_veil_generation_failed") from error


@app.get("/api/artworks/{artwork_id}")
def artwork(artwork_id: str):
    try:
        return service.get(artwork_id).model_dump(mode="json")
    except FileNotFoundError as error:
        raise HTTPException(status_code=404, detail="artwork_not_found") from error


@app.get("/api/artworks/{artwork_id}/image")
def artwork_image(artwork_id: str):
    try:
        record = service.get(artwork_id)
        path = Path(record.image_path).resolve()
        if GENERATED_DIR not in path.parents:
            raise HTTPException(status_code=404, detail="image_not_found")
        return FileResponse(path, media_type="image/png")
    except FileNotFoundError as error:
        raise HTTPException(status_code=404, detail="artwork_not_found") from error
