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

export const GET: RequestHandler = async ({ params }) => {
	// [로그] 요청 수신 확인
	console.log(`\n--- [video-stream] 요청 수신: ${new Date().toISOString()} ---`);
	
	// [수정] params.id -> params.Index로 변경
	const Index = params.Index; 
	console.log(`[1. 파라미터] 요청된 동영상 Index: ${Index}`);

	if (!Index || isNaN(Number(Index))) {
		console.error('[오류] Index가 유효하지 않습니다.');
		throw error(400, '유효한 동영상 Index가 필요합니다.');
	}

	const client = await pool.connect();
	let filePath: string; // DB에 저장된 컨테이너 경로

	try {
		// 1. DB에서 파일 경로 조회
		console.log('[2. DB] 데이터베이스에서 파일 경로 조회를 시작합니다...');
		const query = `
            SELECT "LocationFile" 
            FROM "TumerMovie" 
            WHERE "Index" = $1 AND "MovieType" = 1;
        `;
		console.log(`[2. DB] 실행할 쿼리: SELECT "LocationFile" FROM "TumerMovie" WHERE "Index" = ${Index}`);
		// [수정] id -> Index
		const result = await client.query(query, [Index]);

		if (result.rows.length === 0) {
			// [수정] id -> Index
			console.warn(`[2. DB] [Index: ${Index}]에 해당하는 동영상을 찾지 못했습니다.`);
			throw error(404, `해당 Index(${Index})의 동영상을 찾을 수 없습니다.`);
		}
		
		filePath = result.rows[0].LocationFile;
		console.log(`[2. DB] 조회된 컨테이너 경로: ${filePath}`);

	} catch (dbError) {
		console.error('[2. DB] [오류] 데이터베이스 조회 중 심각한 오류 발생:', dbError);
		throw error(500, '데이터베이스 조회 중 오류 발생');
	} finally {
		client.release();
		console.log('[2. DB] 데이터베이스 연결이 해제되었습니다.');
	}

	// [수정] 3. 경로 변환 로직 전체 삭제

	try {
		// 4. 파일 정보(stat) 확인 및 스트림 생성
		// [수정] hostFilePath 대신 DB에서 가져온 filePath를 직접 사용합니다.
		console.log(`[4. 파일 시스템] 컨테이너 내부 경로에서 파일 정보를 확인합니다: ${filePath}`);
		const stat = fs.statSync(filePath);
		const fileSize = stat.size;
		const fileExtension = path.extname(filePath).toLowerCase();
		console.log(`[4. 파일 시스템] 파일 크기: ${fileSize} bytes`);

		let contentType = 'video/mp4'; // 기본값
		if (fileExtension === '.webm') contentType = 'video/webm';
		if (fileExtension === '.ogv') contentType = 'video/ogg';

		console.log(`[4. 파일 시스템] Content-Type: ${contentType}`);

		const fileStream = fs.createReadStream(filePath);
		console.log('[5. 스트리밍] 파일 스트림을 생성하고 클라이언트로 전송을 시작합니다...');

		// 5. 스트림 응답 반환
		return new Response(fileStream as any, {
			status: 200,
			headers: {
				'Content-Type': contentType,
				'Content-Length': fileSize.toString(),
				'Accept-Ranges': 'bytes'
			}
		});

	} catch (fileError: any) {
		// [오류] 파일 시스템 에러 처리
		if (fileError.code === 'ENOENT') {
			console.error(`[4. 파일 시스템] [오류] 파일을 찾을 수 없습니다 (ENOENT). 경로: ${filePath}`);
			throw error(404, '파일 시스템에서 동영상을 찾을 수 없습니다.');
		}
		if (fileError.code === 'EACCES') {
			console.error(`[4. 파일 시스템] [오류] 파일 접근 권한이 없습니다 (EACCES). 경로: ${filePath}`);
			throw error(500, `파일에 접근할 권한이 없습니다 (EACCES): ${filePath}`);
		}
		console.error('[오류] 동영상 스트리밍 중 알 수 없는 파일 오류 발생:', fileError);
		throw error(500, '동영상 스트리밍 중 오류 발생');
	}
};
