export default class ArtistModel {
  constructor() {
    this.apiUrl = 'http://localhost:3000';
  }

  async getAll() {
    try {
      const [artistsResponse, countriesResponse, epochsResponse] = await Promise.all([
        fetch(`${this.apiUrl}/artists`),
        fetch(`${this.apiUrl}/countries`),
        fetch(`${this.apiUrl}/epochs`)
      ]);
      if (!artistsResponse.ok || !countriesResponse.ok || !epochsResponse.ok) {
        throw new Error('Ошибка загрузки данных');
      }
      const artists = await artistsResponse.json();
      const countries = await countriesResponse.json();
      const epochs = await epochsResponse.json();

      console.log('Сырые артисты:', artists);
      console.log('Страны:', countries);
      console.log('Эпохи:', epochs);

      const artistsWithRelations = artists.map(artist => {
        const countryId = Number(artist.countryId); // Приводим к числу
        const epochId = Number(artist.epochId);    // Приводим к числу
        const country = countries.find(c => Number(c.id) === countryId) || { id: null, name: 'Не указана' };
        const epoch = epochs.find(e => Number(e.id) === epochId) || { id: null, name: 'Не указана' };
        console.log(`Артист ${artist.name}: countryId=${countryId}, country=${JSON.stringify(country)}, epochId=${epochId}, epoch=${JSON.stringify(epoch)}`);
        return {
          ...artist,
          country,
          epoch
        };
      });

      console.log('Артисты с отношениями:', artistsWithRelations);
      return artistsWithRelations;
    } catch (error) {
      console.error('Ошибка в getAll:', error);
      throw error;
    }
  }

  async getById(id) {
    try {
      const [artistResponse, countriesResponse, epochsResponse] = await Promise.all([
        fetch(`${this.apiUrl}/artists/${id}`),
        fetch(`${this.apiUrl}/countries`),
        fetch(`${this.apiUrl}/epochs`)
      ]);
      if (!artistResponse.ok || !countriesResponse.ok || !epochsResponse.ok) {
        throw new Error('Ошибка загрузки данных');
      }
      const artist = await artistResponse.json();
      const countries = await countriesResponse.json();
      const epochs = await epochsResponse.json();

      const countryId = Number(artist.countryId); // Приводим к числу
      const epochId = Number(artist.epochId);    // Приводим к числу
      const country = countries.find(c => Number(c.id) === countryId) || { id: null, name: 'Не указана' };
      const epoch = epochs.find(e => Number(e.id) === epochId) || { id: null, name: 'Не указана' };
      console.log(`Артист ${artist.name}: countryId=${countryId}, country=${JSON.stringify(country)}, epochId=${epochId}, epoch=${JSON.stringify(epoch)}`);

      const artistWithRelations = {
        ...artist,
        country,
        epoch
      };

      console.log('Полученный артист с отношениями:', artistWithRelations);
      return artistWithRelations;
    } catch (error) {
      console.error('Ошибка в getById:', error);
      throw error;
    }
  }

  async getCountries() {
    try {
      const response = await fetch(`${this.apiUrl}/countries`);
      if (!response.ok) throw new Error('Ошибка загрузки стран');
      return await response.json();
    } catch (error) {
      console.error('Ошибка в getCountries:', error);
      throw error;
    }
  }

  async getEpochs() {
    try {
      const response = await fetch(`${this.apiUrl}/epochs`);
      if (!response.ok) throw new Error('Ошибка загрузки эпох');
      return await response.json();
    } catch (error) {
      console.error('Ошибка в getEpochs:', error);
      throw error;
    }
  }

  async create(artist) {
    try {
      const response = await fetch(`${this.apiUrl}/artists`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(artist)
      });
      if (!response.ok) throw new Error('Ошибка создания исполнителя');
      const createdArtist = await response.json();
      console.log('Созданный артист:', createdArtist);
      return createdArtist;
    } catch (error) {
      console.error('Ошибка в create:', error);
      throw error;
    }
  }

  async update(id, artist) {
    try {
      const response = await fetch(`${this.apiUrl}/artists/${id}`, {
        method: 'PATCH',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(artist)
      });
      if (!response.ok) throw new Error('Ошибка обновления исполнителя');
      const updatedArtist = await response.json();
      console.log('Обновленный артист:', updatedArtist);
      return updatedArtist;
    } catch (error) {
      console.error('Ошибка в update:', error);
      throw error;
    }
  }

  async delete(id) {
    try {
      const response = await fetch(`${this.apiUrl}/artists/${id}`, {
        method: 'DELETE'
      });
      if (!response.ok) throw new Error('Ошибка удаления исполнителя');
      return true;
    } catch (error) {
      console.error('Ошибка в delete:', error);
      throw error;
    }
  }
}