//! video2slides.famzheng.me — 长视频按固定间隔抽帧，逐帧差异比较，
//! 拖动阈值挑出关键画面/幻灯片。
//!
//! - 静态 SPA + SPA fallback 由 cube-core::base 处理。
//! - `/api/*` 一组 REST：上传（multipart 流式落盘）→ 分析（后台线程跑 ffmpeg
//!   抽帧 + image crate 逐帧灰度差异，前端轮询进度）→ 取帧元数据 / 缩略图 / 大图。
//! - 按 `X-Client-Id` 头分目录，每个浏览器只看到自己上传的。
//! - 存储靠 hostPath 挂进来的目录（默认 /data），pod 重启不丢。

mod core;
mod handlers;

use axum::extract::DefaultBodyLimit;
use axum::routing::{delete, get, post};
use axum::Router;

use handlers::AppState;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    cube_core::init_tracing();

    let dist = std::env::var("VIDEO2SLIDES_DIST_DIR").unwrap_or_else(|_| "/dist".into());
    let data_dir = std::env::var("VIDEO2SLIDES_DATA_DIR").unwrap_or_else(|_| "/data".into());
    std::fs::create_dir_all(&data_dir)?;
    tracing::info!(%data_dir, "video2slides data dir");

    let state = AppState::new(data_dir.into());

    let api = Router::new()
        .route("/videos", post(handlers::upload_video).get(handlers::list_videos))
        .route("/videos/:id", delete(handlers::delete_video))
        .route("/videos/:id/analyze", post(handlers::analyze))
        .route("/videos/:id/job", get(handlers::job_status))
        .route("/videos/:id/frames", get(handlers::frames))
        .route("/videos/:id/thumb/:idx", get(handlers::thumb))
        .route("/videos/:id/frame/:idx", get(handlers::frame))
        .layer(DefaultBodyLimit::disable()) // 视频上传可能很大，关掉默认 2MB 限制
        .with_state(state);

    let app = cube_core::base(dist).nest("/api", api);
    cube_core::serve(app, 8080).await
}
