/**
 * 카메라 파라미터 파일 저장/조회
 *
 * 클라이언트(카메라 파라미터 패널)의 '서버에 저장' 버튼이 현재 파라미터를
 * 영상과 같은 폴더(VIDEOS_DIR)에 `<영상 base>.camera.json` 으로 저장한다.
 * 이후 사용자가 폴더를 다시 선택하면(영상과 함께 이 json 이 딸려 오면)
 * 클라이언트 로더가 이 파일의 카메라 값을 최우선으로 적용한다.
 */

import { Router, Request, Response } from 'express';
import path from 'path';
import fs from 'fs';
import { config } from '../config';

const router = Router();

function cameraFilePath(videoId: string): string | null {
  const base = videoId.replace(/\.[^.]+$/, '');
  if (!base) return null;
  const filePath = path.resolve(config.videosDir, `${base}.camera.json`);
  // Path traversal 방어 — VIDEOS_DIR 내부만 허용
  if (!filePath.startsWith(path.resolve(config.videosDir))) return null;
  return filePath;
}

// PUT /api/camera/:videoId — 카메라 파라미터 저장 (body = { camera: {...}, model?, savedAt? })
router.put('/:videoId', (req: Request, res: Response) => {
  const filePath = cameraFilePath(req.params.videoId);
  if (!filePath) {
    res.status(400).json({ error: 'Invalid video ID' });
    return;
  }
  const body = req.body;
  if (!body || typeof body !== 'object' || typeof body.camera !== 'object') {
    res.status(400).json({ error: 'body.camera 객체가 필요합니다' });
    return;
  }
  try {
    fs.writeFileSync(filePath, JSON.stringify(body, null, 2), 'utf-8');
    res.json({ ok: true, file: path.basename(filePath) });
  } catch (e) {
    res.status(500).json({ error: String(e) });
  }
});

// GET /api/camera/:videoId — 저장된 카메라 파라미터 조회 (없으면 404)
router.get('/:videoId', (req: Request, res: Response) => {
  const filePath = cameraFilePath(req.params.videoId);
  if (!filePath) {
    res.status(400).json({ error: 'Invalid video ID' });
    return;
  }
  if (!fs.existsSync(filePath)) {
    res.status(404).json({ error: 'camera.json 없음' });
    return;
  }
  try {
    res.json(JSON.parse(fs.readFileSync(filePath, 'utf-8')));
  } catch (e) {
    res.status(500).json({ error: String(e) });
  }
});

export default router;
