import { Router } from "express";
import {
  uploadFiles,
  deleteFile,
  getFileList,
  getComponentFiles,
  downloadFile,
  previewFile,
  getLinkedFiles,
  uploadMiddleware,
  generateTempToken,
  getFileByToken,
  setRepresentativeFile,
  getFileInfo,
} from "../controllers/fileController";
import { authenticateToken } from "../middleware/authMiddleware";

const router = Router();

// 공개 접근 라우트 (인증 불필요)
/**
 * @route GET /api/files/public/:token
 * @desc 임시 토큰으로 파일 접근 (Google Docs Viewer용)
 * @access Public
 */
router.get("/public/:token", getFileByToken);

/**
 * @route GET /api/files/preview/:objid
 * @desc 파일 미리보기 (이미지 등) - 공개 접근 허용
 * @access Public
 */
router.get("/preview/:objid", previewFile);

/**
 * @route GET /api/files/info/:objid
 * @desc 파일 정보 조회 (메타데이터만, 파일 내용 없음) - 공개 접근 허용
 * @access Public
 */
router.get("/info/:objid", getFileInfo);

// 모든 파일 API는 인증 필요
router.use(authenticateToken);

/**
 * @route POST /api/files/upload
 * @desc 파일 업로드 (attach_file_info 테이블에 저장)
 * @access Private
 */
router.post("/upload", uploadMiddleware, uploadFiles);

/**
 * @route GET /api/files
 * @desc 파일 목록 조회
 * @query targetObjid, docType, companyCode
 * @access Private
 */
router.get("/", getFileList);

/**
 * @route GET /api/files/component-files
 * @desc 컴포넌트의 템플릿 파일과 데이터 파일 모두 조회
 * @query screenId, componentId, tableName, recordId, columnName
 * @access Private
 */
router.get("/component-files", getComponentFiles);

/**
 * @route GET /api/files/linked/:tableName/:recordId
 * @desc 테이블 연결된 파일 조회
 * @access Private
 */
router.get("/linked/:tableName/:recordId", getLinkedFiles);

/**
 * @route DELETE /api/files/:objid
 * @desc 파일 삭제 (논리적 삭제)
 * @access Private
 */
router.delete("/:objid", deleteFile);

// preview 라우트는 상단 공개 접근 구역으로 이동됨

/**
 * @route GET /api/files/download/:objid
 * @desc 파일 다운로드
 * @access Private
 */
router.get("/download/:objid", downloadFile);

/**
 * @route POST /api/files/temp-token/:objid
 * @desc Google Docs Viewer용 임시 공개 토큰 생성
 * @access Private
 */
router.post("/temp-token/:objid", generateTempToken);

/**
 * @route PUT /api/files/representative/:objid
 * @desc 대표 파일 설정
 * @access Private
 */
router.put("/representative/:objid", setRepresentativeFile);

export default router;
