"""업로드 API와 다운로드 페이지 라우트."""
from typing import Optional

from fastapi import APIRouter, File, HTTPException, UploadFile
from fastapi.responses import FileResponse

from .config import WEB_DIR, public_base_url
from . import storage

router = APIRouter()


@router.post("/api/sessions")
async def create_session(
    image: UploadFile = File(...),
    video: Optional[UploadFile] = File(None),
):
    """완성된 사진(+촬영 영상)을 받아 공유 주소를 돌려줍니다."""
    storage.purge_old()
    sid = storage.new_id()
    try:
        await storage.save_upload(sid, image, storage.PHOTO_NAME)
        if video is not None and video.filename:
            name = storage.video_name(video.content_type, video.filename)
            await storage.save_upload(sid, video, name)
    except ValueError as e:
        raise HTTPException(status_code=413, detail=str(e))
    return {"id": sid, "url": "{}/s/{}".format(public_base_url(), sid)}


@router.get("/api/sessions/{sid}")
def read_session(sid: str):
    if not storage.valid_id(sid):
        raise HTTPException(status_code=404, detail="없는 주소입니다")
    files = storage.list_files(sid)
    if not files:
        raise HTTPException(status_code=404, detail="만료되었거나 없는 사진입니다")
    return {"id": sid, "files": files}


@router.get("/s/{sid}")
def download_page(sid: str):
    if not storage.valid_id(sid):
        raise HTTPException(status_code=404, detail="없는 주소입니다")
    return FileResponse(WEB_DIR / "download.html")


@router.get("/files/{sid}/{name}")
def download_file(sid: str, name: str, download: int = 0):
    """미리보기는 그대로, download=1 이면 저장용 이름을 붙여 내려보냅니다."""
    if not storage.valid_id(sid) or "/" in name or ".." in name:
        raise HTTPException(status_code=404, detail="없는 파일입니다")
    path = storage.session_dir(sid) / name
    if not path.is_file():
        raise HTTPException(status_code=404, detail="만료되었거나 없는 파일입니다")
    if download:
        return FileResponse(path, filename="인생네컷_{}_{}".format(sid, name))
    return FileResponse(path)
