/**
 * Auth Service - Mirror backend auth endpoints
 */
import { apiClient } from '../client';
import {
  UserRegistration,
  UserLogin,
  TokenResponse,
  RefreshTokenRequest,
  PasswordChange,
  PasswordReset,
  UserResponse,
  UserUpdate,
  TokenVerificationResponse,
  AuthHealthResponse,
} from '../types/auth';

export class AuthService {
  private readonly baseUrl = '/auth';

  async register(userData: UserRegistration): Promise<TokenResponse> {
    return apiClient.post<TokenResponse>(`${this.baseUrl}/register`, userData);
  }

  async login(loginData: UserLogin): Promise<TokenResponse> {
    return apiClient.post<TokenResponse>(`${this.baseUrl}/login`, loginData);
  }

  async refreshToken(refreshToken: string): Promise<TokenResponse> {
    const refreshData: RefreshTokenRequest = { refresh_token: refreshToken };
    return apiClient.post<TokenResponse>(`${this.baseUrl}/refresh`, refreshData);
  }

  async verifyToken(token?: string): Promise<TokenVerificationResponse> {
    // If token is provided, temporarily set it; otherwise use current token
    const currentToken = apiClient.getAuthToken();
    if (token && token !== currentToken) {
      apiClient.setAuthToken(token);
    }

    const response = await apiClient.post<TokenVerificationResponse>(`${this.baseUrl}/verify`);

    // Restore original token if we temporarily changed it
    if (token && token !== currentToken) {
      apiClient.setAuthToken(currentToken);
    }

    return response;
  }

  async logout(refreshToken: string): Promise<{ message: string }> {
    const refreshData: RefreshTokenRequest = { refresh_token: refreshToken };
    return apiClient.post<{ message: string }>(`${this.baseUrl}/logout`, refreshData);
  }

  async changePassword(passwordData: PasswordChange): Promise<{ message: string }> {
    return apiClient.post<{ message: string }>(`${this.baseUrl}/change-password`, passwordData);
  }

  async resetPassword(resetData: PasswordReset): Promise<{ message: string }> {
    return apiClient.post<{ message: string }>(`${this.baseUrl}/reset-password`, resetData);
  }

  async getProfile(): Promise<UserResponse> {
    return apiClient.get<UserResponse>('/users/me');
  }

  async updateProfile(updateData: UserUpdate): Promise<UserResponse> {
    return apiClient.put<UserResponse>('/users/me', updateData);
  }

  async verifyEmail(
    userId: string,
    verificationToken: string
  ): Promise<{ message: string }> {
    return apiClient.post<{ message: string }>(`${this.baseUrl}/verify-email`, {
      user_id: userId,
      verification_token: verificationToken,
    });
  }

  async healthCheck(): Promise<AuthHealthResponse> {
    return apiClient.get<AuthHealthResponse>(`${this.baseUrl}/health`);
  }
}

export const authService = new AuthService();