import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';
import { inject } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Router } from '@angular/router';
import { catchError, throwError } from 'rxjs';
import { AuthStore } from '../auth/auth-store';

export const errorInterceptor: HttpInterceptorFn = (req, next) => {
  const authStore = inject(AuthStore);
  const router = inject(Router);
  const snackBar = inject(MatSnackBar);

  return next(req).pipe(
    catchError((error: unknown) => {
      if (error instanceof HttpErrorResponse) {
        if (error.status === 401) {
          authStore.clearSession();
          void router.navigate(['/auth/login']);
          snackBar.open('Sitzung abgelaufen. Bitte erneut anmelden.', 'OK', { duration: 5000 });
        } else if (error.status >= 400 && error.status < 500) {
          const message =
            typeof error.error?.message === 'string' && error.error.message.trim().length > 0
              ? error.error.message
              : 'Es ist ein Fehler aufgetreten.';
          snackBar.open(message, 'OK', { duration: 5000 });
        } else if (error.status >= 500) {
          snackBar.open('Es ist ein Fehler aufgetreten. Bitte versuche es später erneut.', 'OK', {
            duration: 5000,
          });
        }
      }
      return throwError(() => error);
    }),
  );
};
