from sqlalchemy.orm import Session
from src.menu_design.apps.projects import models, schemas, utils
from typing import List, Union
from sqlalchemy import func
from fastapi import HTTPException
import base64
import os
import uuid
from pathlib import Path


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)



def get_project_by_slug(db: Session, slug: str):
    return db.query(models.Project).filter(models.Project.slug == slug).first()



def get_projects_by_slugs_or_ids(db: Session, ids: List[Union[int, str]]):
    return db.query(models.Project).filter(
        (models.Project.id.in_([i for i in ids if isinstance(i, int)])) |
        (models.Project.slug.in_([i for i in ids if isinstance(i, str)]))
    ).all()



def update_project(db: Session, project_id: int, project: schemas.ProjectUpdate):
    db_project = db.query(models.Project).filter(models.Project.id == project_id).first()
    if not db_project:
        return None
    # for key, value in project.dict(exclude_unset=True).items():
    #     setattr(db_project, key, value)
    update_data = project.dict(exclude_unset=True)

    # If name is updated, regenerate slug
    # if "name" in update_data:
    #     new_slug_base = update_data["name"].lower().replace(" ", "-")
    #     unique_slug = utils.generate_unique_slug(db, new_slug_base)
    #     if not unique_slug:
    #         raise ValueError("Failed to generate a unique slug")
    #     update_data["slug"] = unique_slug

    for key, value in update_data.items():
        setattr(db_project, key, value)
    db.commit()
    db.refresh(db_project)
    return db_project



def delete_project(db: Session, project_id: int):
    db_project = db.query(models.Project).filter(models.Project.id == project_id).first()
    if db_project:
        db_project.deleted_at = func.now()
        db.commit()
    return db_project

def upload_template_image(payload: schemas.Base64ImageUpload):
    try:
        # Parse and decode base64 data
        if "," in payload.base64_data:
            _, data = payload.base64_data.split(",", 1)
        else:
            data = payload.base64_data

        # Determine file extension
        ext = "png"
        if "jpeg" in payload.base64_data or "jpg" in payload.base64_data:
            ext = "jpg"
        elif "gif" in payload.base64_data:
            ext = "gif"

        # Generate a unique filename
        image_filename = f"{uuid.uuid4().hex}.{ext}"
        image_filepath = os.path.join(STATIC_PATH, image_filename)

        # Save the decoded image
        with open(image_filepath, "wb") as f:
            f.write(base64.b64decode(data))

        # Generate the public URL (adjust path if needed)
        full_image_url = f"{BASE_URL}static/template_images/{image_filename}"

        return {"url": full_image_url}

    except Exception as e:
        raise HTTPException(status_code=400, detail=f"Invalid image data: {str(e)}")

