import type { APIRoute } from 'astro';
import { authService } from '@/lib/authService';
import type { AuthClient } from '@/lib/authService';

export const POST: APIRoute = async ({ request }) => {
    try {
        // 1. ПРОВЕРКА ТИПА КОНТЕНТА
        // Это защитит от ошибки "Unexpected token..." если фронтенд отправит FormData вместо JSON
        const contentType = request.headers.get("Content-Type") || "";
        if (!contentType.includes("application/json")) {
            return new Response(
                JSON.stringify({
                    success: false,
                    message: "Invalid content type. Expected application/json."
                }),
                {
                    status: 400,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // 2. ПОЛУЧЕНИЕ ДАННЫХ
        const requestData = await request.json();
        const { email, password } = requestData;

        // Валидация полей
        if (!email || !password) {
            return new Response(
                JSON.stringify({
                    success: false,
                    message: 'Please provide email and password.'
                }),
                {
                    status: 400,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // Валидация длины email
        const trimmedEmail = email.trim();
        if (trimmedEmail.length < 5 || trimmedEmail.length > 100) {
            return new Response(
                JSON.stringify({
                    success: false,
                    message: 'Email must be between 5 and 100 characters.'
                }),
                {
                    status: 400,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // Валидация email формата
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        if (!emailRegex.test(trimmedEmail)) {
            return new Response(
                JSON.stringify({
                    success: false,
                    message: 'Please provide a valid email address.'
                }),
                {
                    status: 400,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // Валидация длины пароля
        if (password.length < 8 || password.length > 128) {
            return new Response(
                JSON.stringify({
                    success: false,
                    message: 'Password must be between 8 and 128 characters.'
                }),
                {
                    status: 400,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // Проверка на наличие HTML тегов в email для предотвращения XSS
        if (/<[^>]*>/g.test(trimmedEmail)) {
            return new Response(
                JSON.stringify({
                    success: false,
                    message: 'Email contains invalid characters.'
                }),
                {
                    status: 400,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // 3. ИНИЦИАЛИЗАЦИЯ POCKETBASE
        // Используем хелпер, который правильно обрабатывает URL и куки
        const pb: AuthClient = authService.createClientFromRequest(request);

        // 4. ПОПЫТКА АУТЕНТИФИКАЦИИ
        // Если пароль неверный, PocketBase выбросит ошибку (мы поймаем её в catch)
        const authData = await pb.collection('users').authWithPassword(email, password);

        // 5. ПРОВЕРКА ПОДТВЕРЖДЕНИЯ EMAIL
        if (!authData.record.verified) {
            pb.authStore.clear(); // Сбрасываем токен, так как вход запрещен
            return new Response(
                JSON.stringify({
                    success: false,
                    message: 'Please verify your email address before logging in.'
                }),
                {
                    status: 401,
                    headers: { 'Content-Type': 'application/json' }
                }
            );
        }

        // 6. ГЕНЕРАЦИЯ ЗАГОЛОВКОВ С КУКАМИ
        // authService внутри ставит secure: false для localhost, что критически важно
        const authHeaders = authService.createAuthHeaders(pb);

        // 7. УСПЕШНЫЙ ОТВЕТ
        const responseHeaders: Record<string, string> = {
            'Content-Type': 'application/json'
        };

        // Добавляем заголовки авторизации
        Object.entries(authHeaders).forEach(([key, value]) => {
            responseHeaders[key] = value;
        });

        return new Response(
            JSON.stringify({
                success: true,
                user: {
                    id: authData.record.id,
                    email: authData.record.email,
                    name: authData.record.name
                }
            }),
            {
                status: 200,
                headers: responseHeaders
            }
        );

    } catch (error: any) {
        // === ЛОГИРОВАНИЕ ОШИБОК (В ТЕРМИНАЛ) ===
        console.error('❌ Login API Error:');
        console.error('Message:', error.message);

        // Если PocketBase вернул детализированную ошибку (например, валидация)
        if (error?.response?.data) {
            console.error('Details:', JSON.stringify(error.response.data, null, 2));
        }
        // ========================================

        // Определяем статус ошибки для клиента
        // 400 в PocketBase обычно означает "Invalid credentials" (неверный логин/пароль)
        const status = error.status === 400 ? 400 : 500;

        const message = status === 400
            ? 'Invalid email or password.'
            : 'An internal server error occurred.';

        return new Response(
            JSON.stringify({
                success: false,
                message: message
            }),
            {
                status: status,
                headers: { 'Content-Type': 'application/json' }
            }
        );
    }
}