import { YggdrasilClient, YggrasilAuthentication } from '@xmcl/user';
import { v4 as uuidv4 } from 'uuid';
import { API_BASE_URL } from '../renderer/api';

// Ely.by сервер
const ELY_BY_AUTH_SERVER = API_BASE_URL;

export class AuthService {
  private client: YggdrasilClient;

  constructor() {
    this.client = new YggdrasilClient(ELY_BY_AUTH_SERVER);
  }

  async login(
    username: string,
    password: string,
  ): Promise<YggrasilAuthentication> {
    try {
      // Генерируем уникальный clientToken
      const clientToken = uuidv4();

      // Выполняем запрос напрямую к правильному URL
      const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/authenticate`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          username,
          password,
          clientToken,
          requestUser: true,
        }),
      });

      if (!response.ok) {
        const errorText = await response.text();
        throw new Error(`Ошибка авторизации: ${response.status} ${errorText}`);
      }

      const auth = await response.json();
      console.log(`Аутентификация успешна для ${auth.selectedProfile?.name}`);
      return auth;
    } catch (error) {
      console.error('Ошибка при авторизации:', error);
      throw error;
    }
  }

  async validate(accessToken: string, clientToken: string): Promise<boolean> {
    try {
      console.log(accessToken, clientToken);
      const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/validate`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ accessToken, clientToken }),
      });

      return response.ok;
    } catch (error) {
      console.error('Ошибка при валидации токена:', error);
      return false;
    }
  }

  async refresh(
    accessToken: string,
    clientToken: string,
  ): Promise<YggrasilAuthentication | null> {
    try {
      const response = await fetch(`${ELY_BY_AUTH_SERVER}/auth/refresh`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ accessToken, clientToken }),
      });

      if (!response.ok) {
        return null;
      }

      return await response.json();
    } catch (error) {
      console.error('Ошибка при обновлении токена:', error);
      return null;
    }
  }
}
