import os
from typing import Optional, List
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form, Query
from sqlalchemy.orm import Session
from pydantic import BaseModel
from app.database import get_db
from app.models.cloth import Cloth
from app.services.rembg_service import RembgService

router = APIRouter()

class ClothCreate(BaseModel):
    sku: str
    name: str
    category: str = "Tops"
    brand: str = "MAP Collection"
    gender: str = "Unisex"
    price: float = 0.0
    description: Optional[str] = ""
    tryon_prompt: Optional[str] = ""
    original_image_url: Optional[str] = ""
    cutout_image_url: Optional[str] = ""
    mask_image_url: Optional[str] = ""
    is_active: bool = True
    sort_order: int = 0

class ClothUpdate(BaseModel):
    name: Optional[str] = None
    category: Optional[str] = None
    brand: Optional[str] = None
    gender: Optional[str] = None
    price: Optional[float] = None
    description: Optional[str] = None
    tryon_prompt: Optional[str] = None
    original_image_url: Optional[str] = None
    cutout_image_url: Optional[str] = None
    mask_image_url: Optional[str] = None
    is_active: Optional[bool] = None
    sort_order: Optional[int] = None

@router.get("/")
def list_clothes(
    category: Optional[str] = Query(None),
    search: Optional[str] = Query(None),
    active_only: bool = Query(True),
    db: Session = Depends(get_db)
):
    query = db.query(Cloth)
    if active_only:
        query = query.filter(Cloth.is_active == True)
    if category and category.lower() != "all":
        query = query.filter(Cloth.category.ilike(f"%{category}%"))
    if search:
        query = query.filter(
            (Cloth.name.ilike(f"%{search}%")) | 
            (Cloth.sku.ilike(f"%{search}%")) |
            (Cloth.brand.ilike(f"%{search}%"))
        )
    clothes = query.order_by(Cloth.sort_order.asc(), Cloth.id.desc()).all()
    return [c.to_dict() for c in clothes]

@router.get("/{cloth_id}")
def get_cloth(cloth_id: int, db: Session = Depends(get_db)):
    cloth = db.query(Cloth).filter(Cloth.id == cloth_id).first()
    if not cloth:
        raise HTTPException(status_code=404, detail="Cloth item not found")
    return cloth.to_dict()

@router.post("/")
def create_cloth(payload: ClothCreate, db: Session = Depends(get_db)):
    # Check if SKU exists
    existing = db.query(Cloth).filter(Cloth.sku == payload.sku).first()
    if existing:
        raise HTTPException(status_code=400, detail="SKU already exists")
    
    # Auto-generate try-on prompt if blank
    prompt = payload.tryon_prompt
    if not prompt or not prompt.strip():
        prompt = RembgService.generate_vton_prompt(
            cloth_name=payload.name,
            category=payload.category,
            brand=payload.brand,
            gender=payload.gender
        )

    cloth = Cloth(
        sku=payload.sku,
        name=payload.name,
        category=payload.category,
        brand=payload.brand,
        gender=payload.gender,
        price=payload.price,
        description=payload.description or "",
        tryon_prompt=prompt,
        original_image_url=payload.original_image_url or "",
        cutout_image_url=payload.cutout_image_url or "",
        mask_image_url=payload.mask_image_url or "",
        is_active=payload.is_active,
        sort_order=payload.sort_order
    )
    db.add(cloth)
    db.commit()
    db.refresh(cloth)
    return cloth.to_dict()

@router.put("/{cloth_id}")
def update_cloth(cloth_id: int, payload: ClothUpdate, db: Session = Depends(get_db)):
    cloth = db.query(Cloth).filter(Cloth.id == cloth_id).first()
    if not cloth:
        raise HTTPException(status_code=404, detail="Cloth item not found")

    update_data = payload.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(cloth, key, value)
    
    db.commit()
    db.refresh(cloth)
    return cloth.to_dict()

@router.delete("/{cloth_id}")
def delete_cloth(cloth_id: int, db: Session = Depends(get_db)):
    cloth = db.query(Cloth).filter(Cloth.id == cloth_id).first()
    if not cloth:
        raise HTTPException(status_code=404, detail="Cloth item not found")
    db.delete(cloth)
    db.commit()
    return {"status": "deleted", "id": cloth_id}

@router.post("/upload")
async def upload_cloth_image(
    file: UploadFile = File(...),
    cloth_name: str = Form("New Garment"),
    category: str = Form("Tops"),
    brand: str = Form("MAP Collection"),
    gender: str = Form("Unisex")
):
    contents = await file.read()
    results = RembgService.process_and_save(contents, filename_prefix="apparel")
    suggested_prompt = RembgService.generate_vton_prompt(
        cloth_name=cloth_name,
        category=category,
        brand=brand,
        gender=gender
    )
    return {
        "status": "success",
        **results,
        "suggested_prompt": suggested_prompt
    }
