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

interface Rectangle {
    id: number;
    x: number;
    y: number;
    width: number;
    height: number;
}

// POST handler for bulk updates
export const POST: RequestHandler = async ({ request }) => {
    try {
        const rectangles = await request.json() as Rectangle[];

        if (!rectangles || rectangles.length === 0) {
            return json({ error: 'No rectangles data provided' }, { status: 400 });
        }

        // --- 효율적인 Bulk Update를 위한 SQL 쿼리 생성 ---

        // 1. 업데이트할 ID 목록을 만듭니다. (예: [1, 2, 3])
        const ids = rectangles.map(rect => rect.id);

        // 2. 파라미터화된 쿼리를 위한 값 배열을 준비합니다.
        // [x1, y1, x1+w1, y1+h1, x2, y2, x2+w2, y2+h2, ...]
        const tumerPositionValues = rectangles.flatMap(rect => [rect.x, rect.y, rect.x + rect.width, rect.y + rect.height]);
        
        // 3. CASE 문을 동적으로 생성합니다.
        // 예: WHEN "Index" = $5 THEN ARRAY[$1,$2,$3,$4] WHEN "Index" = $10 THEN ARRAY[$6,$7,$8,$9]
        let caseStatement = '';
        rectangles.forEach((rect, index) => {
            const baseIndex = index * 4;
            // 각 사각형의 TumerPosition 배열을 위한 파라미터 인덱스
            const p1 = baseIndex + 1;
            const p2 = baseIndex + 2;
            const p3 = baseIndex + 3;
            const p4 = baseIndex + 4;
            // 각 사각형의 ID를 위한 파라미터 인덱스
            const idParamIndex = tumerPositionValues.length + index + 1;
            
            caseStatement += `WHEN "Index" = $${idParamIndex} THEN ARRAY[$${p1}::double precision, $${p2}::double precision, $${p3}::double precision, $${p4}::double precision] `;
        });

        // 4. 최종 SQL 쿼리를 조합합니다.
        const query = `
            UPDATE public."TumerDataset"
            SET "TumerPosition" = CASE ${caseStatement} END
            WHERE "Index" IN (${ids.map((_, i) => `$${tumerPositionValues.length + i + 1}`).join(', ')})
        `;
        
        // 5. 쿼리에 필요한 모든 값을 하나의 배열로 합칩니다.
        const allValues = [...tumerPositionValues, ...ids];

        // 6. 데이터베이스에 단 한 번의 쿼리를 실행합니다.
        await pool.query(query, allValues);

        return json({ success: true, message: `${rectangles.length} rectangles updated.` });

    } catch (err) {
        console.error('API Error during bulk update:', err);
        return json({ error: 'Failed to bulk update rectangles' }, { status: 500 });
    }
};