// src/app/services/auth.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import { Observable, BehaviorSubject, of } from 'rxjs';
import { tap, catchError } from 'rxjs/operators';
import { NzMessageService } from 'ng-zorro-antd/message';

// 定义登录请求和响应的数据结构
interface LoginResponse {
  token: string;
  message: string;
  user: {
    id: string;
    username: string;
  };
}

@Injectable({
  providedIn: 'root',
})
export class AuthService {
  // 后端 API 的基础 URL
  private readonly baseUrl = '/api/admin';

  // 使用 BehaviorSubject 来存储和管理认证状态，并向组件广播状态变化
  private isLoggedInSubject = new BehaviorSubject<boolean>(this.hasToken());
  public isLoggedIn$ = this.isLoggedInSubject.asObservable();

  constructor(
    private http: HttpClient,
    private router: Router,
    private message: NzMessageService // 注入 NgZorro 的消息服务
  ) {}

  /**
   * 检查本地存储中是否存在有效的 JWT token
   * @returns {boolean} 如果存在 token 则返回 true
   */
  private hasToken(): boolean {
    const token = localStorage.getItem('authToken');
    // 在实际项目中，您可能需要进一步验证 token 是否过期
    return !!token;
  }

  /**
   * 处理管理员登录
   * @param {string} username - 用户名
   * @param {string} password - 密码
   * @returns {Observable<LoginResponse>} - 登录响应的可观察对象
   */
  login(credentials: {
    username: string;
    password: string;
  }): Observable<LoginResponse> {
    return this.http
      .post<LoginResponse>(`${this.baseUrl}/login`, credentials)
      .pipe(
        tap((response) => {
          // 登录成功，将 token 存储到本地
          localStorage.setItem('authToken', response.token);
          this.isLoggedInSubject.next(true); // 更新认证状态
          this.message.success('登录成功！欢迎回来。'); // 显示成功消息
          this.router.navigate(['/dashboard']); // 导航到主页
        }),
        catchError((error) => {
          // 登录失败，处理错误
          console.error('Login failed:', error);
          this.message.error(
            error.error.message || '登录失败，请检查用户名和密码。'
          ); // 显示错误消息
          // 返回一个空的 Observable，防止应用崩溃
          return of(error);
        })
      );
  }

  /**
   * 管理员登出
   */
  logout(): void {
    localStorage.removeItem('authToken'); // 移除 token
    this.isLoggedInSubject.next(false); // 更新认证状态
    this.message.info('您已安全退出。');
    this.router.navigate(['/login']); // 导航回登录页
  }

  /**
   * 获取存储的 JWT token
   * @returns {string | null} JWT token 或 null
   */
  getToken(): string | null {
    return localStorage.getItem('authToken');
  }
}
