from fastapi import APIRouter, Depends, HTTPException,status,Query, Path
from sqlalchemy.orm import Session
from typing import List, Union, Optional
from src.menu_design.apps.projects import schemas
from src.menu_design.apps.projects import controller 
from src.menu_design.apps.projects import services
from src.utils.db import get_db
from src.menu_design.apps.projects import models
from src.menu_design.apps.projects import utils
import os

# from dotenv import load_dotenv

# load_dotenv()

# BASE_URL = os.getenv("BASE_URL", "http://localhost:8000")

# # BASE_URL = os.getenv("BASE_URL", "http://localhost:8000/")


# # Dynamically resolve root directory and static image save path
# BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
# STATIC_PATH = os.path.join(BASE_DIR, "menu_design", "designer", "static", "template_images")
# os.makedirs(STATIC_PATH, exist_ok=True)

router = APIRouter()



@router.post("", response_model=schemas.ProjectOut)
def create_project(project: schemas.ProjectCreate, db: Session = Depends(get_db)):
    return services.create_project(db, project)



@router.get("/{slug}", response_model=schemas.ProjectOut)
def get_project(slug: str, db: Session = Depends(get_db)):
    db_project = controller.get_project_by_slug(db, slug)
    if not db_project:
        raise HTTPException(status_code=404, detail="Project not found")
    return db_project



@router.post("/batch", response_model=List[schemas.ProjectOut])
def get_projects(ids: List[Union[int, str]], db: Session = Depends(get_db)):
    return controller.get_projects_by_slugs_or_ids(db, ids)

@router.get("/branch/{branch_id}", response_model=List[schemas.ProjectOut])
def search_projects(
    branch_id: int = Path(...),
    q: Optional[str] = Query(None),
    db: Session = Depends(get_db)
):
#if query is true, search by slug or name
    if q:
        results = db.query(models.Project).filter(
            (models.Project.slug.ilike(f"%{q}%")) |
            (models.Project.name.ilike(f"%{q}%"))
        ).all()
        if results:
            return results 
        else:
            raise HTTPException(status_code=404, detail="No projects found matching the query")

    # Fallback to branch_id
    all_projects = db.query(models.Project).filter(models.Project.branch_id == branch_id).all()
    if not all_projects:
        raise HTTPException(status_code=404, detail="No projects found for this branch")
    return all_projects  




@router.put("/{project_id}", response_model=schemas.ProjectOut)
def update_project(project_id: int, project: schemas.ProjectUpdate, db: Session = Depends(get_db)):
    db_project = controller.update_project(db, project_id, project)
    if not db_project:
        raise HTTPException(status_code=404, detail="Project not found")
    return db_project



@router.delete("/{project_id}")
def delete_project(project_id: int, db: Session = Depends(get_db)):
    db_project = controller.delete_project(db, project_id)
    if not db_project:
        raise HTTPException(status_code=404, detail="Project not found")
    return {"detail": "Deleted"}






@router.post("/upload-template-image")
def upload_template_image(payload: schemas.Base64ImageUpload):
    return controller.upload_template_image(payload)
