import { NextRequest, NextResponse } from 'next/server';
import { bd } from '@/lib/bd';
import { verifyAdminToken } from '@/lib/verifyAdmin';

// GET - получить все бронирования для админки
export async function GET(req: NextRequest) {
    const token = req.cookies.get('token')?.value;
    if (!verifyAdminToken(token)) {
        return NextResponse.json({ error: 'Нет доступа' }, { status: 401 });
    }

    try {
        const { searchParams } = new URL(req.url);
        const date = searchParams.get('date');
        const room = searchParams.get('room');

        let query = 'SELECT * FROM bookings WHERE 1=1';
        const params: any[] = [];

        if (date) {
            query += ' AND DATE(date_time) = ?';
            params.push(date);
        }

        if (room) {
            query += ' AND room = ?';
            params.push(room);
        }

        query += ' ORDER BY date_time DESC, time_slot ASC';

        const [bookings] = await bd.query(query, params);

        return NextResponse.json({ bookings });
    } catch (error) {
        console.error('Ошибка при получении бронирований:', error);
        return NextResponse.json(
            { error: 'Ошибка сервера' },
            { status: 500 }
        );
    }
}

// PUT - обновить статус бронирования
export async function PUT(req: NextRequest) {
    const token = req.cookies.get('token')?.value;
    if (!verifyAdminToken(token)) {
        return NextResponse.json({ error: 'Нет доступа' }, { status: 401 });
    }

    try {
        const { id, status } = await req.json();

        if (!id || !status) {
            return NextResponse.json(
                { error: 'Необходимы id и status' },
                { status: 400 }
            );
        }

        await bd.query(
            'UPDATE bookings SET status = ? WHERE id = ?',
            [status, id]
        );

        return NextResponse.json({ success: true });
    } catch (error) {
        console.error('Ошибка при обновлении бронирования:', error);
        return NextResponse.json(
            { error: 'Ошибка сервера' },
            { status: 500 }
        );
    }
}

// POST - создать новое бронирование (для админки)
export async function POST(req: NextRequest) {
    const token = req.cookies.get('token')?.value;
    if (!verifyAdminToken(token)) {
        return NextResponse.json({ error: 'Нет доступа' }, { status: 401 });
    }

    try {
        const data = await req.json();
        const { type, room, date, time, name, game, contact, contactMethod, status } = data;

        if (!type || !room || !date || !time || !name || !contact) {
            return NextResponse.json(
                { error: 'Не все обязательные поля заполнены' },
                { status: 400 }
            );
        }

        // Формируем datetime из date и time
        const dateTime = `${date} ${time}:00`;

        // Проверяем доступность слота перед созданием (если статус не cancelled)
        if (status !== 'cancelled') {
            const [existingBookings] = await bd.query(
                `SELECT COUNT(*) as count FROM bookings 
                 WHERE DATE(date_time) = ? AND time_slot = ? AND room = ? AND status != 'cancelled'`,
                [date, time, room]
            ) as any[];

            const bookedCount = existingBookings[0]?.count || 0;

            // Получаем максимальную вместимость для типа комнаты
            const ROOM_CAPACITY: Record<string, number> = {
                'solo': 5,
                'duo': 4,
                'trio': 3,
                'bootcamp 5': 2,
                'bootcamp 6': 1,
            };

            const maxCapacity = ROOM_CAPACITY[room] || 0;

            if (bookedCount >= maxCapacity) {
                return NextResponse.json(
                    { error: 'Этот временной слот уже занят' },
                    { status: 409 }
                );
            }
        }

        // Создаем бронирование
        const [result] = await bd.query(
            `INSERT INTO bookings (type, room, date_time, time_slot, name, game, contact, contact_method, status, created_at) 
             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())`,
            [type, room, dateTime, time, name, game || null, contact, contactMethod || null, status || 'pending']
        ) as any[];

        return NextResponse.json({
            success: true,
            id: result.insertId,
        });
    } catch (error) {
        console.error('Ошибка при создании бронирования:', error);
        return NextResponse.json(
            { error: 'Ошибка сервера' },
            { status: 500 }
        );
    }
}

// DELETE - удалить бронирование
export async function DELETE(req: NextRequest) {
    const token = req.cookies.get('token')?.value;
    if (!verifyAdminToken(token)) {
        return NextResponse.json({ error: 'Нет доступа' }, { status: 401 });
    }

    try {
        const { searchParams } = new URL(req.url);
        const id = searchParams.get('id');

        if (!id) {
            return NextResponse.json(
                { error: 'Необходим id' },
                { status: 400 }
            );
        }

        await bd.query('DELETE FROM bookings WHERE id = ?', [id]);

        return NextResponse.json({ success: true });
    } catch (error) {
        console.error('Ошибка при удалении бронирования:', error);
        return NextResponse.json(
            { error: 'Ошибка сервера' },
            { status: 500 }
        );
    }
}
