// ДЗ : Async, Await. Параллельность и Последовательность
// задание 1 Chat
{
  let nextMessageId = 0;

  // Отправляет сообщение в чат
  async function sendMessage(nick, message) {
    const data = {
      func: 'addMessage',
      nick: nick,
      message: message,
      nextMessageId: nextMessageId,
    };

    const response = await jsonPost('http://students.a-level.com.ua:10012', data);
    nextMessageId = response.nextMessageId;
    return response;
  }

  // Читает все сообщения из чата и отображает их в контейнере
  async function readMessages() {
    const data = {
      func: 'getMessages',
      nextMessageId: nextMessageId,
    };
    const response = await jsonPost('http://students.a-level.com.ua:10012', data);
    nextMessageId = response.nextMessageId;

    const messages = response.messages;
    const container = document.getElementById('chat-container');

    for (const message of messages) {
      const messageNode = document.createElement('div');
      messageNode.innerHTML = `<b>${message.nick}</b>: ${message.message}`;
      container.appendChild(messageNode);
    }
  }

  // Читает только новые сообщения из чата
  async function readNewMessages() {
    const data = {
      func: 'getMessages',
      nextMessageId: nextMessageId,
    };
    const response = await jsonPost('http://students.a-level.com.ua:10012', data);
    nextMessageId = response.nextMessageId;
    const newMessages = response.messages;

    // обрабатывает новые сообщения
  }

  // Периодически проверяет наличие новых сообщений
  setInterval(readNewMessages, 5000);
}

// или (не уверен какой из вариантов правильный)

{
  const serverUrl = 'http://students.a-level.com.ua:10012';
  let nextMessageId = 0;

  // Отправляет сообщение в чат
  async function sendMessage(nick, message) {
    const data = {
      nick: nick,
      message: message,
      nextMessageId: nextMessageId,
    };

    const response = await jsonPost(serverUrl, data);
    nextMessageId = response.nextMessageId;
    return response;
  }

  // Читает все сообщения из чата и отображает их в контейнере
  async function readMessages() {
    const response = await jsonPost(serverUrl, { nextMessageId: nextMessageId });
    nextMessageId = response.nextMessageId;

    const messages = response.messages;
    const container = document.getElementById('chat-container');

    for (const message of messages) {
      const messageNode = document.createElement('div');
      messageNode.innerHTML = `<b>${message.nick}</b>: ${message.message}`;
      container.appendChild(messageNode);
    }
  }

  // Читает только новые сообщения из чата
  async function readNewMessages() {
    const response = await jsonPost(serverUrl, { nextMessageId: nextMessageId });
    nextMessageId = response.nextMessageId;
    const newMessages = response.messages;

    // обрабатывает новые сообщения
  }

  // Периодически проверяет наличие новых сообщений
  setInterval(readNewMessages, 5000);

  // Отправка сообщения асинхронно
  async function sendMessageAsync(nick, message) {
    const send = await sendMessage(nick, message);
    const read = await readNewMessages();
    return { send, read };
  }
}

// задание 2 SWAPI Links
{
  async function swapiLinks(url) {
    const response = await fetch(url);
    const data = await response.json();

    const promises = [];
    for (let key in data) {
      if (typeof data[key] === 'string' && data[key].startsWith('http')) {
        promises.push(swapiLinks(data[key]));
      }
      if (Array.isArray(data[key])) {
        for (let item of data[key]) {
          if (typeof item === 'string' && item.startsWith('http')) {
            promises.push(swapiLinks(item));
          }
        }
      }
    }

    const resolvedLinks = await Promise.all(promises);

    for (let key in data) {
      if (typeof data[key] === 'string' && data[key].startsWith('http')) {
        data[key] = resolvedLinks.shift();
      }
      if (Array.isArray(data[key])) {
        for (let i = 0; i < data[key].length; i++) {
          if (typeof data[key][i] === 'string' && data[key][i].startsWith('http')) {
            data[key][i] = resolvedLinks.shift();
          }
        }
      }
    }

    return data;
  }

  swapiLinks('https://swapi.dev/api/people/20/');
  const swapiLinks = async (url) => {
    const response = await fetch(url);
    const data = await response.json();

    const promises = [];
    const replaceLinks = (obj) => {
      Object.keys(obj).forEach((key) => {
        if (Array.isArray(obj[key])) {
          obj[key] = obj[key].map(replaceLinks);
        } else if (typeof obj[key] === 'object' && obj[key] !== null) {
          replaceLinks(obj[key]);
        } else if (typeof obj[key] === 'string' && obj[key].startsWith('https://swapi.dev/api/')) {
          promises.push(
            fetch(obj[key])
              .then((res) => res.json())
              .then((json) => (obj[key] = json)),
          );
        }
      });
    };
    replaceLinks(data);

    await Promise.all(promises);
    return data;
  };

  swapiLinks('https://swapi.dev/api/people/20/').then((yodaWithLinks) =>
    console.log(JSON.stringify(yodaWithLinks, null, 4)),
  );
}

// задание 3 domEventPromise
{
  function domEventPromise(element, eventName) {
    return new Promise((resolve) => {
      function eventHandler(event) {
        resolve(event);
        element.removeEventListener(eventName, eventHandler);
      }
      element.addEventListener(eventName, eventHandler);
    });
  }

  const button = document.querySelector('button');
  domEventPromise(button, 'click').then((event) => console.log('event click happens', event));
}
