import hashlib, os, re, uuid
from pathlib import Path
from fastapi import UploadFile, HTTPException
from app.config import settings

ALLOWED_TYPES = {"application/pdf", "image/png", "image/jpeg", "text/plain", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}
FILENAME_RE = re.compile(r"[^A-Za-z0-9._-]")

def safe_filename(name: str) -> str:
    return FILENAME_RE.sub("_", Path(name).name)[:160]

async def save_upload(tenant_id: int, file: UploadFile) -> tuple[str, str, int]:
    if file.content_type not in ALLOWED_TYPES:
        raise HTTPException(status_code=400, detail="Unsupported file type")
    data = await file.read()
    if len(data) > 25 * 1024 * 1024:
        raise HTTPException(status_code=400, detail="File exceeds 25MB MVP limit")
    digest = hashlib.sha256(data).hexdigest()
    base = Path(settings.local_storage_path) / str(tenant_id)
    base.mkdir(parents=True, exist_ok=True)
    dest = base / f"{uuid.uuid4()}-{safe_filename(file.filename or 'upload.bin')}"
    dest.write_bytes(data)
    return str(dest), digest, len(data)
