import type { APIRoute } from 'astro';

const POCKETBASE_URL = import.meta.env.POCKETBASE_URL || 'http://localhost:8090';

// Функция логирования с временной меткой
function log(message: string, data?: unknown) {
  const timestamp = new Date().toISOString();
  console.log(`[REGISTRY][${timestamp}] ${message}`, data ? JSON.stringify(data, null, 2) : '');
}

function logError(message: string, error?: unknown) {
  const timestamp = new Date().toISOString();
  console.error(`[REGISTRY][${timestamp}] ERROR: ${message}`, error);
}

export const POST: APIRoute = async ({ request }) => {
  const requestId = crypto.randomUUID();
  log(`=== Начало запроса регистрации #${requestId} ===`);
  
  try {
    const body = await request.json();
    log('Получены данные формы:', { 
      email: body.email, 
      name: body.name,
      hasPassword: !!body.password,
      hasPasswordConfirm: !!body.passwordConfirm 
    });

    const { email, password, passwordConfirm, name } = body;

    // Валидация
    if (!email || !password || !passwordConfirm) {
      logError(`Валидация не пройдена #${requestId}: отсутствуют обязательные поля`);
      return new Response(
        JSON.stringify({ 
          error: 'Email, пароль и подтверждение пароля обязательны' 
        }),
        { status: 400, headers: { 'Content-Type': 'application/json' } }
      );
    }

    if (password !== passwordConfirm) {
      logError(`Валидация не пройдена #${requestId}: пароли не совпадают`);
      return new Response(
        JSON.stringify({ 
          error: 'Пароли не совпадают' 
        }),
        { status: 400, headers: { 'Content-Type': 'application/json' } }
      );
    }

    if (password.length < 8 || password.length > 12) {
      logError(`Валидация не пройдена #${requestId}: неверная длина пароля (${password.length})`);
      return new Response(
        JSON.stringify({ 
          error: 'Пароль должен быть от 8 до 12 символов' 
        }),
        { status: 400, headers: { 'Content-Type': 'application/json' } }
      );
    }

    log(`Валидация пройдена #${requestId}, отправка в PocketBase...`);

    // Создание пользователя в PocketBase
    const pbPayload = {
      email,
      password,
      passwordConfirm,
      name: name || email.split('@')[0],
      emailVisibility: true,
    };
    
    log('Запрос в PocketBase:', pbPayload);

    const response = await fetch(`${POCKETBASE_URL}/api/collections/users/records`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(pbPayload),
    });

    log(`Ответ PocketBase: статус ${response.status}`);

    const data = await response.json();
    log('Ответ PocketBase (данные):', data);

    if (!response.ok) {
      logError(`Ошибка PocketBase #${requestId}:`, data);
      return new Response(
        JSON.stringify({ 
          error: data.message || 'Ошибка при регистрации',
          data 
        }),
        { status: response.status, headers: { 'Content-Type': 'application/json' } }
      );
    }

    log(`✅ Регистрация успешна #${requestId}: user ${data.id} (${data.email})`);
    
    // Отправка письма с подтверждением email
    log(`Отправка письма подтверждения для ${data.email}...`);
    
    try {
      // Формируем ссылку для подтверждения
      const siteUrl = import.meta.env.PUBLIC_SITE_URL || 'http://localhost:4321';
      const confirmUrl = `${siteUrl}/auth/confirm?token={{.token}}`;
      
      log(`URL подтверждения: ${confirmUrl}`);
      
      // Отправляем письмо через PocketBase API с кастомным шаблоном
      const verifyResponse = await fetch(`${POCKETBASE_URL}/api/collections/users/request-verification`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ 
          email,
          // PocketBase использует шаблон из админ-панели
          // URL подтверждения берётся из настроек коллекции
        }),
      });
      
      log(`Ответ на запрос verification: ${verifyResponse.status}`);
      
      if (verifyResponse.ok) {
        log(`✅ Письмо подтверждения отправлено`);
        log(`Ссылка для подтверждения: ${siteUrl}/auth/confirm?token=...`);
      } else {
        const verifyData = await verifyResponse.json();
        logError(`⚠️ Ошибка отправки письма подтверждения:`, verifyData);
      }
    } catch (verifyError) {
      logError(`⚠️ Ошибка при отправке письма подтверждения:`, verifyError);
      // Не прерываем регистрацию, просто логируем ошибку
    }
    
    return new Response(
      JSON.stringify({ 
        success: true,
        message: 'Пользователь успешно зарегистрирован. Проверьте email для подтверждения.',
        user: {
          id: data.id,
          email: data.email,
          name: data.name,
          verified: data.verified,
        }
      }),
      { status: 201, headers: { 'Content-Type': 'application/json' } }
    );

  } catch (error) {
    logError(`Исключение #${requestId}:`, error);
    return new Response(
      JSON.stringify({ 
        error: 'Внутренняя ошибка сервера' 
      }),
      { status: 500, headers: { 'Content-Type': 'application/json' } }
    );
  }
};
