from __future__ import annotations
from uuid import UUID
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from src.core.database import get_db
from src.domain.admin.router import require_admin
from src.domain.auth.models import User
from src.domain.auth.router import get_current_user
from src.domain.prompt_suggestions.models import PromptSuggestion
from src.domain.prompt_suggestions.schemas import (
    PromptSuggestionCreate, PromptSuggestionListResponse, PromptSuggestionPublicResponse,
    PromptSuggestionPublic, PromptSuggestionResponse, PromptSuggestionUpdate,
)
from src.domain.prompt_suggestions.service import PromptSuggestionService

admin_router = APIRouter(prefix="/api/admin/prompt-suggestions", tags=["admin", "prompt-suggestions"])
public_router = APIRouter(prefix="/api/prompt-suggestions", tags=["prompt-suggestions"])

@admin_router.get("", response_model=PromptSuggestionListResponse)
async def list_admin(_: User = Depends(require_admin), db: AsyncSession = Depends(get_db)):
    items = await PromptSuggestionService(db).repo.list()
    return {"items": items, "total": len(items)}

@admin_router.post("", response_model=PromptSuggestionResponse, status_code=201)
async def create_admin(body: PromptSuggestionCreate, _: User = Depends(require_admin), db: AsyncSession = Depends(get_db)):
    item = PromptSuggestion(**body.model_dump())
    db.add(item)
    await db.commit()
    await db.refresh(item)
    return item

@admin_router.patch("/{suggestion_id}", response_model=PromptSuggestionResponse)
async def update_admin(suggestion_id: UUID, body: PromptSuggestionUpdate, _: User = Depends(require_admin), db: AsyncSession = Depends(get_db)):
    item = await PromptSuggestionService(db).repo.get(suggestion_id)
    if not item:
        from fastapi import HTTPException
        raise HTTPException(status_code=404, detail="Prompt suggestion not found")
    for key, value in body.model_dump(exclude_unset=True).items():
        setattr(item, key, value)
    await db.commit()
    await db.refresh(item)
    return item

@admin_router.delete("/{suggestion_id}", status_code=204)
async def delete_admin(suggestion_id: UUID, _: User = Depends(require_admin), db: AsyncSession = Depends(get_db)):
    item = await PromptSuggestionService(db).repo.get(suggestion_id)
    if item:
        await db.delete(item)
        await db.commit()

@public_router.get("", response_model=PromptSuggestionPublicResponse)
async def suggest_public(
    project_name: str = Query("", max_length=255),
    project_type: str | None = Query(None, max_length=40),
    _: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
):
    items = await PromptSuggestionService(db).suggest(project_name, project_type)
    return {"items": [PromptSuggestionPublic(id=item.id, prompt=item.prompt.replace("{project_name}", project_name.strip() or "my business")) for item in items]}
