import axios from 'axios';

const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:3000';

export interface User {
  id: string;
  email: string;
  name: string | null;
  subscription: string;
}

export interface AuthResponse {
  user: User;
  token: string;
}

export interface RegisterData {
  email: string;
  password: string;
  name: string;
}

export interface LoginData {
  email: string;
  password: string;
}

class AuthService {
  // Stocker le token dans le localStorage
  private setToken(token: string): void {
    localStorage.setItem('token', token);
  }

  // Récupérer le token du localStorage
  getToken(): string | null {
    return localStorage.getItem('token');
  }

  // Stocker l'utilisateur dans le localStorage
  private setUser(user: User): void {
    localStorage.setItem('user', JSON.stringify(user));
  }

  // Récupérer l'utilisateur du localStorage
  getUser(): User | null {
    const userStr = localStorage.getItem('user');
    if (userStr) {
      return JSON.parse(userStr);
    }
    return null;
  }

  // Vérifier si l'utilisateur est connecté
  isLoggedIn(): boolean {
    return !!this.getToken();
  }

  // Inscription d'un nouvel utilisateur
  async register(data: RegisterData): Promise<AuthResponse> {
    try {
      const response = await axios.post<AuthResponse>(`${API_URL}/auth/register`, data);

      if (response.data.token) {
        this.setToken(response.data.token);
        this.setUser(response.data.user);
      }

      return response.data;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        throw new Error(error.response.data.error || 'Erreur lors de l\'inscription');
      }
      throw new Error('Erreur réseau lors de l\'inscription');
    }
  }

  // Connexion d'un utilisateur existant
  async login(data: LoginData): Promise<AuthResponse> {
    try {
      const response = await axios.post<AuthResponse>(`${API_URL}/auth/login`, data);

      if (response.data.token) {
        this.setToken(response.data.token);
        this.setUser(response.data.user);
      }

      return response.data;
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        throw new Error(error.response.data.error || 'Erreur lors de la connexion');
      }
      throw new Error('Erreur réseau lors de la connexion');
    }
  }

  // Déconnexion
  logout(): void {
    localStorage.removeItem('token');
    localStorage.removeItem('user');
  }

  // Obtenir les headers d'authentification
  getAuthHeaders() {
    const token = this.getToken();
    if (token) {
      return {
        Authorization: `Bearer ${token}`
      };
    }
    return {};
  }
}

export default new AuthService(); 