// src/app/interceptors/auth.interceptor.ts
import {
  HttpRequest,
  HttpHandlerFn,
  HttpEvent,
  HttpInterceptorFn,
  HttpErrorResponse // 导入 HttpErrorResponse
} from '@angular/common/http';
import { Observable, throwError } from 'rxjs'; // 导入 throwError
import { catchError } from 'rxjs/operators'; // 导入 catchError 操作符
import { inject } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { Router } from '@angular/router'; // 导入 Router 服务

/**
 * 函数式身份验证拦截器。
 * 捕获所有传出的 HTTP 请求，为非登录请求添加身份验证令牌，并处理 401 Unauthorized 错误。
 */
export const AuthInterceptor: HttpInterceptorFn = (
  request: HttpRequest<any>,
  next: HttpHandlerFn
): Observable<HttpEvent<any>> => {
  const authService = inject(AuthService);
  const router = inject(Router); // 注入 Router 服务
  const authToken = authService.getToken();

  // 检查请求URL是否是登录API，如果是，则不添加令牌
  if (authToken && !request.url.includes('/api/admin/login')) {
    const authReq = request.clone({
      setHeaders: {
        Authorization: `Bearer ${authToken}`
      }
    });

    // 在这里添加错误处理逻辑
    return next(authReq).pipe(
      catchError((error: HttpErrorResponse) => {
        // 如果后端返回 401 或 403 错误，说明令牌无效或已过期
        if (error.status === 401 || error.status === 403) {
          console.error('令牌已过期或无效，自动重定向到登录页。');
          // 调用 AuthService 的登出方法，清除本地存储的令牌
          authService.logout();
          // 重定向到登录页
          router.navigate(['/login']);
        }
        // 重新抛出错误，以便组件中的订阅者仍能收到错误通知
        return throwError(() => error);
      })
    );
  }

  // 如果没有令牌，或者请求是登录API，则直接继续
  return next(request);
};
