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와 동일해야 함)
const IMAGE_REF_BASE_DIR = '/workspace/image/image_ref';

/**
 * 특정 Index의 동영상 및 모든 하위 요소를 재귀적으로 삭제하는 함수
 * @param indexToDelete 삭제할 TumerMovie의 Index
 * @param client 활성 DB 클라이언트 연결
 * @param visited 이미 방문한 Index를 추적하여 무한 루프를 방지하는 Set
 */
const deleteVideoAndChildren = async (indexToDelete: number, client: any, visited: Set<number>): Promise<void> => {
    // [수정] 이미 방문한 Index이면, 무한 루프 방지를 위해 즉시 종료
    if (visited.has(indexToDelete)) {
        console.warn(`[Delete] 순환 참조 발견: Index ${indexToDelete}를 이미 방문했습니다. 삭제를 건너뜁니다.`);
        return;
    }
    // 현재 Index를 방문 목록에 추가
    visited.add(indexToDelete);

    console.log(`[Delete] 삭제 프로세스 시작: Index ${indexToDelete}`);

    // 1. 현재 Index의 정보를 가져옵니다.
    const movieRes = await client.query(
        'SELECT "LocationFile", "MovieType" FROM "TumerMovie" WHERE "Index" = $1', 
        [indexToDelete]
    );

    if (movieRes.rows.length === 0) {
        console.warn(`[Delete] Index ${indexToDelete}는 이미 삭제되었거나 존재하지 않아 건너뜁니다.`);
        return;
    }
    
    const { "LocationFile": locationFile, "MovieType": movieType } = movieRes.rows[0];

    // 원본(Type 2) 또는 Crop(Type 1) 파일인 경우에만 자식을 탐색합니다.
    const canHaveChildren = (movieType === 2 || movieType === 1);

    if (canHaveChildren) {
        console.log(`[Delete] 부모 파일(Index: ${indexToDelete}, Type: ${movieType}) 확인. 하위 요소를 먼저 삭제합니다.`);
        // 2. 이 동영상을 'original_path'로 갖는 모든 자식 동영상을 찾습니다.
        const childrenRes = await client.query(
            'SELECT "Index" FROM "TumerMovie" WHERE "original_path" = $1 AND "Index" != $2', 
            [locationFile, indexToDelete]
        );
        
        // 3. 각 자식에 대해 재귀적으로 삭제 함수 호출 (visited Set 전달)
        for (const child of childrenRes.rows) {
            await deleteVideoAndChildren(child.Index, client, visited);
        }
    } else {
        console.log(`[Delete] 최하위 파일(Index: ${indexToDelete}, Type: ${movieType}) 확인. 자식 탐색을 건너뜁니다.`);
    }


    // 4. 모든 자식이 삭제된 후 (또는 자식이 없는 경우), 현재 Index의 파일과 DB 레코드를 삭제합니다.
    console.log(`[Delete] 이제 Index ${indexToDelete} 자체를 삭제합니다.`);

    // 4-1. 파일 시스템에서 동영상 파일 삭제
    try {
        console.log(`[Delete FS] 동영상 파일 삭제 시도: ${locationFile}`);
        await fs.rm(locationFile, { force: true }); // 파일이 없어도 오류 발생 안 함
    } catch (e: any) {
        console.warn(`[Delete FS] 동영상 파일 삭제 중 경고 (무시): ${e.message}`);
    }

    // 4-2. 파일 시스템에서 관련 프레임 이미지 폴더 삭제
    try {
        const videoFileNameWithoutExt = path.basename(locationFile, path.extname(locationFile));
        const imageRefDir = path.join(IMAGE_REF_BASE_DIR, videoFileNameWithoutExt);
        console.log(`[Delete FS] 이미지 폴더 삭제 시도: ${imageRefDir}`);
        await fs.rm(imageRefDir, { recursive: true, force: true });
    } catch (e: any) {
        console.warn(`[Delete FS] 이미지 폴더 삭제 중 경고 (무시): ${e.message}`);
    }

    // 4-3. DB에서 TumerDatasetRef(자식 레코드) 삭제
    await client.query('DELETE FROM "TumerDatasetRef" WHERE "IndexMovie" = $1', [indexToDelete]);

    // 4-4. DB에서 TumerMovie(부모 레코드) 삭제
    await client.query('DELETE FROM "TumerMovie" WHERE "Index" = $1', [indexToDelete]);
    
    console.log(`[Delete] Index ${indexToDelete} 및 관련 파일/DB 완전 삭제 완료.`);
};


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

    if (!indexToDelete || isNaN(Number(indexToDelete))) {
        throw error(400, '유효한 "index" 파라미터가 필요합니다.');
    }

    const client = await pool.connect();
    try {
        // 모든 DB 및 파일 시스템 작업을 하나의 트랜잭션으로 묶습니다.
        await client.query('BEGIN');
        
        // [수정] 재귀 호출을 시작할 때 비어있는 Set을 생성하여 전달
        await deleteVideoAndChildren(Number(indexToDelete), client, new Set<number>());

        await client.query('COMMIT');
        
        return json({ success: true, message: `Index ${indexToDelete} 및 모든 하위 요소가 성공적으로 삭제되었습니다.` });

    } catch (err: any) {
        await client.query('ROLLBACK');
        console.error(`[API] delete-video-recursive: Index ${indexToDelete} 삭제 중 심각한 오류 발생:`, err);
        throw error(500, `삭제 작업 중 오류가 발생했습니다: ${err.message}`);
    } finally {
        client.release();
    }
};

