import { http, HttpResponse } from 'msw';
import { db } from './database';

export const handlers = [
  // Endpoint para estatísticas do banco de dados
  http.get('/stats', () => {
    const stats = db.getStats();
    console.log('MSW: GET /stats', stats);
    return HttpResponse.json(stats);
  }),

  // Endpoint para resetar o banco de dados (útil para testes)
  http.post('/reset', () => {
    db.reset();
    console.log('MSW: POST /reset - Banco de dados resetado');
    return HttpResponse.json({
      message: 'Banco de dados resetado com sucesso',
    });
  }),

  // Mocks para API externa do Pluggy
  http.post('https://api.pluggy.ai/auth', ({ request }) => {
    const authHeader = request.headers.get('Authorization');
    console.log('MSW: POST https://api.pluggy.ai/auth', { authHeader });
    return HttpResponse.json({
      apiKey: 'mock_api_key_123',
    });
  }),

  http.get('https://api.pluggy.ai/items', ({ request }) => {
    const authHeader = request.headers.get('X-API-KEY');
    console.log('MSW: GET https://api.pluggy.ai/items', { authHeader });
    return HttpResponse.json({
      total: 1,
      results: [
        {
          id: 'mock_item_123',
          connector: {
            id: 1,
            name: 'Mock Bank',
            type: 'BANK',
          },
          status: 'UPDATED',
          createdAt: '2024-01-01T00:00:00Z',
          updatedAt: '2024-01-01T00:00:00Z',
        },
      ],
    });
  }),

  // Mock para qualquer endpoint do Pluggy com método GET
  http.get('https://api.pluggy.ai/*', ({ request, params }) => {
    const path = params['*'];
    const authHeader = request.headers.get('X-API-KEY');
    console.log('MSW: GET https://api.pluggy.ai/*', { path, authHeader });
    return HttpResponse.json({
      success: true,
      data: { message: 'Mock response for GET', path },
    });
  }),

  // Mock para qualquer endpoint do Pluggy com método POST
  http.post('https://api.pluggy.ai/*', async ({ request, params }) => {
    const path = params['*'];
    const authHeader = request.headers.get('X-API-KEY');
    const body = await request.json();
    console.log('MSW: POST https://api.pluggy.ai/*', {
      path,
      authHeader,
      body,
    });
    return HttpResponse.json({
      success: true,
      data: { message: 'Mock response for POST', path, body },
    });
  }),

  http.post('https://api.pluggy.ai/items', async ({ request }) => {
    const body = await request.json();
    console.log('MSW: POST https://api.pluggy.ai/items', body);
    return HttpResponse.json({
      id: 'mock_item_new_123',
      connector: {
        id: 1,
        name: 'Mock Bank',
        type: 'BANK',
      },
      status: 'WAITING_USER_INPUT',
      createdAt: new Date().toISOString(),
      updatedAt: new Date().toISOString(),
    });
  }),

  http.post('https://api.pluggy.ai/connect_token', async ({ request }) => {
    const body = (await request.json()) as { itemId?: string };
    console.log('MSW: POST https://api.pluggy.ai/connect_token', body);
    return HttpResponse.json({
      accessToken: 'mock_connect_token_123',
      itemId: body?.itemId || 'mock_item_123',
    });
  }),

  // Mock para Laravel API
  http.get('http://localhost:8000/api/health', () => {
    console.log('MSW: GET Laravel API health');
    return HttpResponse.json({
      status: 'OK',
      source: 'Laravel API',
      timestamp: new Date().toISOString(),
    });
  }),

  http.post('http://localhost:8000/api/validate-token', async ({ request }) => {
    const body = (await request.json()) as { token?: string };
    console.log('MSW: POST Laravel API validate-token', body);
    return HttpResponse.json({
      valid: true,
      source: 'Laravel API',
      token: body?.token,
    });
  }),

  http.get('http://localhost:8000/api/user/profile', ({ request }) => {
    const authHeader = request.headers.get('Authorization');
    console.log('MSW: GET Laravel API user profile', { authHeader });
    return HttpResponse.json({
      id: 1,
      name: 'Mock User',
      email: 'user@example.com',
      source: 'Laravel API',
    });
  }),

  http.get('http://localhost:8000/api/client/profile', ({ request }) => {
    const authHeader = request.headers.get('Authorization');
    console.log('MSW: GET Laravel API client profile', { authHeader });
    return HttpResponse.json({
      id: 1,
      name: 'Mock Client',
      email: 'client@example.com',
      source: 'Laravel API',
    });
  }),

  http.post(
    'http://localhost:8000/api/proxy/*',
    async ({ request, params }) => {
      const body = (await request.json()) as { method?: string; data?: any };
      const path = params['*'];
      console.log('MSW: POST Laravel API proxy', { path, body });
      return HttpResponse.json({
        source: 'Laravel API via BFF Proxy',
        path,
        method: body?.method || 'GET',
        data: body?.data,
      });
    },
  ),

  http.get('http://localhost:8000/api/test/user-endpoint', ({ request }) => {
    const authHeader = request.headers.get('Authorization');
    console.log('MSW: GET Laravel API test user endpoint', { authHeader });
    return HttpResponse.json({
      message: 'Endpoint de teste para usuário acessado com sucesso',
      source: 'Laravel API',
    });
  }),

  http.get('http://localhost:8000/api/test/client-endpoint', ({ request }) => {
    const authHeader = request.headers.get('Authorization');
    console.log('MSW: GET Laravel API test client endpoint', { authHeader });
    return HttpResponse.json({
      message: 'Endpoint de teste para client acessado com sucesso',
      source: 'Laravel API',
    });
  }),
];
