import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import pool from '$lib/server/database';
import fs from 'fs/promises';

/**
 * 지정된 경로의 파일을 안전하게 삭제합니다.
 * (위에 있는 헬퍼 함수 코드를 여기에 붙여넣으세요)
 */
async function deleteFileIfExists(filePath: string | null | undefined) {
	if (!filePath) {
		console.warn('[File] 삭제할 파일 경로가 없습니다.');
		return;
	}
	try {
		await fs.unlink(filePath);
		console.log(`[File] 삭제 완료: ${filePath}`);
	} catch (e: any) {
		if (e.code === 'ENOENT') {
			console.warn(`[File] 삭제하려 했으나 이미 없음: ${filePath}`);
		} else {
			console.error(`[File] 파일 삭제 중 오류 발생: ${filePath}`, e);
			throw new Error(`파일 삭제 실패: ${filePath}`);
		}
	}
}

// --- API 핸들러 ---

export const POST: RequestHandler = async ({ request }) => {
	const { Index } = await request.json(); // video-crop/+page.svelte에서 보낸 id

	if (!Index) {
		return json({ success: false, error: 'Index가 필요합니다.' }, { status: 400 });
	}

	const client = await pool.connect();

	try {
		// --- 트랜잭션 시작 ---
		await client.query('BEGIN');

		// 1. [조회] 삭제할 Crop 동영상(Type 1)의 파일 경로와 원본 경로를 찾습니다.
		const cropVideoQuery = `
            SELECT "LocationFile", "original_path" 
            FROM "TumerMovie" 
            WHERE "Index" = $1 AND "MovieType" = 1;
        `;
		const cropResult = await client.query(cropVideoQuery, [Index]);

		if (cropResult.rows.length === 0) {
			// 이미 삭제되었거나 존재하지 않는 Index일 수 있습니다.
			await client.query('ROLLBACK'); // 트랜잭션 롤백
			return json(
				{ success: false, error: `[Index: ${Index}] MovieType 1 동영상을 찾을 수 없습니다.` },
				{ status: 404 }
			);
		}

		const cropFilePath: string | null = cropResult.rows[0].LocationFile;
		const originalPath: string | null = cropResult.rows[0].original_path;

		// 2. [삭제] Crop 동영상(Type 1)의 DB 레코드를 삭제합니다.
		await client.query(`DELETE FROM "TumerMovie" WHERE "Index" = $1;`, [Index]);
		console.log(`[DB] MovieType 1 (Index: ${Index}) 레코드 삭제 완료.`);

		// 3. [삭제] 원본 동영상(Type 2)의 DB 레코드와 파일을 삭제합니다.
		if (originalPath) {
			// 3a. 원본 DB 레코드 삭제
			const deleteOriginalQuery = `
                DELETE FROM "TumerMovie" 
                WHERE "LocationFile" = $1 AND "MovieType" = 2;
            `;
			const deleteResult = await client.query(deleteOriginalQuery, [originalPath]);
			
			if (deleteResult.rowCount > 0) {
				console.log(`[DB] MovieType 2 (Path: ${originalPath}) 레코드 삭제 완료.`);
			} else {
				console.warn(`[DB] MovieType 2 (Path: ${originalPath}) 레코드를 찾을 수 없습니다.`);
			}

			// 3b. 원본 파일 삭제
			await deleteFileIfExists(originalPath);
		}

		// 4. [삭제] Crop 동영상(Type 1)의 파일을 삭제합니다.
		await deleteFileIfExists(cropFilePath);

		// --- 모든 작업 성공: 트랜잭션 커밋 ---
		await client.query('COMMIT');

		return json({ success: true, message: `[Index: ${Index}] Crop 동영상 및 원본이 삭제되었습니다.` });
	} catch (error: any) {
		// --- 오류 발생: 트랜잭션 롤백 ---
		await client.query('ROLLBACK');
		console.error('Error deleting video:', error);
		return json({ success: false, error: '삭제 중 오류 발생', details: error.message }, { status: 500 });
	} finally {
		// 클라이언트를 풀에 반환
		client.release();
	}
};