import { HttpInterceptorFn, HttpResponse } from '@angular/common/http';
import { inject } from '@angular/core';
import { DialogService } from '../dialog.service';
import { AuthService } from '../auth/auth.service';
import { ErrorModalService } from '../error/error-modal.service';
import { tap, catchError } from 'rxjs/operators';
import { throwError } from 'rxjs';

export const authInterceptor: HttpInterceptorFn = (req, next) => {
  const dialogService = inject(DialogService);
  const authService = inject(AuthService);
  const errorModalService = inject(ErrorModalService);
  
  // 🔑 USAR AuthService para obter token correto
  const token = authService.getToken();
  const tenantId = localStorage.getItem('tenant_id');

  // 🔍 DEBUG: Log para verificar tokens
  console.log('🔍 Interceptor - URL:', req.url);
  console.log('🔍 Interceptor - Token encontrado:', token ? 'SIM' : 'NÃO');
  console.log('🔍 Interceptor - Tenant ID:', tenantId);
  console.log('🔍 Interceptor - Content-Type original:', req.headers.get('Content-Type'));
  console.log('🔍 Interceptor - Body type:', req.body?.constructor?.name);

  // ✅ Para requisições multipart/form-data, não interferir com Content-Type
  let headers = req.headers
    .set('x-tenant-user-auth', token ? `${token}` : '')
    .set('x-tenant-uuid', tenantId || '');

  // ✅ Se for FormData, não definir Accept para não interferir
  if (!(req.body instanceof FormData)) {
    headers = headers.set('Accept', 'application/json');
  }

  const modifiedReq = req.clone({ headers });
  
  return next(modifiedReq).pipe(
    tap((event) => {
      if (event instanceof HttpResponse) {
        // Tratamento de respostas de sucesso
        if (event.status === 201) {
          dialogService.openSnackBar('Registro criado com sucesso!', 'success');
        } else if (event.status === 200 && req.method !== 'GET') {
          dialogService.openSnackBar('Operação realizada com sucesso!', 'success');
        }
      }
    }),
    catchError((error) => {
      console.log('🚨 [AuthInterceptor] Erro capturado:', error);
      
      // 🚪 Logout automático para 401 (token inválido)
      if (error.status === 401) {
        authService.logout();
      }
      
      // 🎯 Usar ErrorModalService para exibir erro de forma amigável
      errorModalService.handleHttpError(error);
      
      return throwError(() => error);
    })
  );
}; 