// src/routes/api/delete-cut-video/+server.ts

import { error, json } from '@sveltejs/kit';
import pool from '$lib/server/database';
import * as fs from 'fs/promises';
import * as path from 'path';

// cut-segments-progress와 동일한 경로 설정이 필요합니다.
// (나중에 이 경로들은 $lib/server/config.ts 같은 곳으로 빼는 것이 좋습니다)
const FINAL_OUTPUT_DIR = path.resolve(process.cwd(), 'static', 'cuts');
const IMAGE_REF_BASE_DIR = '/workspace/image/image_ref'; // registerVideoInDB의 경로와 동일해야 함

export const DELETE: import('@sveltejs/kit').RequestHandler = async ({ url }) => {
    const indexToDelete = url.searchParams.get('index');

    if (!indexToDelete || isNaN(Number(indexToDelete))) {
        throw error(400, '유효한 "index"가 필요합니다.');
    }
    console.log(`[Delete] 삭제 요청 수신: TumerMovie Index ${indexToDelete}`);

    const client = await pool.connect();
    let locationFile: string | null = null;

    try {
        // --- 1. DB 삭제 (트랜잭션) ---
        await client.query('BEGIN');

        // 1-1. TumerDatasetRef (자식) 레코드 삭제
        console.log(`[Delete DB] "TumerDatasetRef" (IndexMovie=${indexToDelete}) 삭제 시작...`);
        const refDeleteRes = await client.query(
            'DELETE FROM public."TumerDatasetRef" WHERE "IndexMovie" = $1',
            [indexToDelete]
        );
        console.log(`[Delete DB] "TumerDatasetRef" ${refDeleteRes.rowCount}개 레코드 삭제 완료.`);

        // 1-2. TumerMovie (부모) 레코드 삭제 및 파일명 반환
        console.log(`[Delete DB] "TumerMovie" (Index=${indexToDelete}) 삭제 시작...`);
        const movieDeleteRes = await client.query(
            'DELETE FROM public."TumerMovie" WHERE "Index" = $1 RETURNING "LocationFile"',
            [indexToDelete]
        );

        if (movieDeleteRes.rows.length === 0) {
            // 이미 삭제되었거나 존재하지 않는 Index일 수 있음
            console.warn(`[Delete DB] "TumerMovie" (Index=${indexToDelete}) 찾을 수 없음.`);
            await client.query('ROLLBACK'); // 롤백
            throw error(404, `Index ${indexToDelete}에 해당하는 동영상을 DB에서 찾을 수 없습니다.`);
        }
        
        locationFile = movieDeleteRes.rows[0].LocationFile;
        console.log(`[Delete DB] "TumerMovie" 삭제 완료. 파일명: ${locationFile}`);

        // 1-3. 트랜잭션 커밋
        await client.query('COMMIT');

    } catch (dbError: any) {
        await client.query('ROLLBACK');
        console.error('[Delete DB] DB 삭제 트랜잭션 중 오류 발생:', dbError);
        throw error(500, `DB 삭제 중 오류: ${dbError.message}`);
    } finally {
        client.release();
    }

    // --- 2. 파일 시스템 삭제 (DB 트랜잭션 성공 후에만 실행) ---
    if (!locationFile) {
        // 이 경우는 거의 없지만, 안전 장치
        console.warn(`[Delete FS] LocationFile이 없어 파일 삭제를 건너뜁니다.`);
        return json({ success: true, message: 'DB 삭제 완료. 파일 경보 없음.' });
    }

    try {
        // 2-1. 동영상 파일 삭제
        const videoPath = path.join(FINAL_OUTPUT_DIR, locationFile);
        console.log(`[Delete FS] 동영상 파일 삭제 시도: ${videoPath}`);
        try {
            await fs.rm(videoPath, { force: true }); // force: true (파일 없으면 에러 안 냄)
            console.log(`[Delete FS] 동영상 파일 삭제 완료.`);
        } catch (videoErr) {
            console.warn(`[Delete FS] 동영상 파일 삭제 중 경고 (무시):`, videoErr);
        }

        // 2-2. 이미지 프레임 폴더 삭제
        // 'V00000001_crop..._cut-0.mp4' -> 'V00000001_crop..._cut-0'
        const videoFileNameWithoutExt = locationFile.split('.').slice(0, -1).join('.');
        const imageRefDir = path.join(IMAGE_REF_BASE_DIR, videoFileNameWithoutExt);
        
        console.log(`[Delete FS] 이미지 폴더 삭제 시도: ${imageRefDir}`);
        try {
            await fs.rm(imageRefDir, { recursive: true, force: true });
            console.log(`[Delete FS] 이미지 폴더 삭제 완료.`);
        } catch (imgErr) {
            console.warn(`[Delete FS] 이미지 폴더 삭제 중 경고 (무시):`, imgErr);
        }

        return json({ success: true, message: 'DB 및 파일 시스템 삭제 완료' });

    } catch (fsError: any) {
        // DB는 삭제됐지만 파일 삭제 중 심각한 오류 발생
        console.error('[Delete FS] 파일 시스템 삭제 중 치명적 오류 발생:', fsError);
        // 클라이언트에게는 오류를 알리지만, DB는 이미 커밋되었음을 인지해야 함
        throw error(500, `파일 시스템 삭제 중 오류: ${fsError.message} (DB는 삭제되었을 수 있습니다)`);
    }
};