// ДЗ: Функции
// задание 1 Temperature
{
  function celsiusToFahrenheit(celsius) {
    return (9 / 5) * celsius + 32;
  }
}

{
  function fahrenheitToCelsius(fahrenheit) {
    return (5 / 9) * (fahrenheit - 32);
  }
}

{
  // Чтобы вызвать функцию, нужно написать ее имя, а затем указать аргументы в скобках. Например:
  let fahrenheit = celsiusToFahrenheit(30);
  console.log(`30°C = ${fahrenheit}°F`);

  let celsius = fahrenheitToCelsius(86);
  console.log(`86°F = ${celsius}°C`);
}

// задание 2 RGB
{
  function createCSSColor(r, g, b) {
    r = r.toString(16);
    g = g.toString(16);
    b = b.toString(16);
    r = r.length === 1 ? '0' + r : r;
    g = g.length === 1 ? '0' + g : g;
    b = b.length === 1 ? '0' + b : b;
    return '#' + r + g + b;
  }
}

// блок кода функции является обязательным элементом функции, и его нужно указывать в любом случае

// задание 3 Flats
{
  function findApartment(floors, apartmentsPerFloor, apartmentNumber) {
    const countFlatsAtEntrance = floors * apartmentsPerFloor;
    const entrance = Math.ceil(apartmentNumber / countFlatsAtEntrance);
    const floor = Math.ceil(
      (countFlatsAtEntrance - (countFlatsAtEntrance * entrance - apartmentNumber)) /
        apartmentsPerFloor,
    );
    return { entrance, floor };
  }
}
// задание 4 Credentials
{
  function getFullName() {
    // Функция, которая преобразует строку в формат "Слово с большой буквы"
    function capitalize(str) {
      return str[0].toUpperCase() + str.slice(1).toLowerCase();
    }

    const name = capitalize(prompt('Введите ваше имя').trim());
    const surname = capitalize(prompt('Введите вашу фамилию').trim());
    const fatherName = capitalize(prompt('Введите ваше отчество').trim());

    const fullName = `${surname} ${name} ${fatherName}`;

    return { name, surname, fatherName, fullName };
  }

  const result = getFullName();
  console.log(result); // {name: "Имя", surname: "Фамилия", fatherName: "Отчество", fullName: "Фамилия Имя Отчество"}
}
// задание 5 New line
{
  function getMultiLineString(inputString) {
    return inputString.split('\\n').join('\n');
  }

  const result = getMultiLineString('Первая строка\\nВторая строка\\nТретья строка');
  console.log(result); // "Первая строка\nВторая строка\nТретья строка"
}
// задание 6 Prompt OR
{
  function getUserInput(promptString, defaultValue) {
    return prompt(promptString) || defaultValue;
  }
}

{
  // Пример использования:
  let year = getInput('укажите ваш возраст', '22');
  const date = 2022 - year;
  alert(date);
}
// задание 7 Login And Password
{
  function checkCredentials(correctLogin, correctPassword) {
    const userLogin = prompt('Login');
    if (userLogin !== correctLogin) {
      alert('Wrong login');
      return false;
    }

    const userPassword = prompt('Password');
    if (userPassword !== correctPassword) {
      alert('Wrong password');
      return false;
    }

    alert('congratz');
    return true;
  }
}
// задание 8 For Table
{
  function createTable(data) {
    let html = '<table>';

    for (let i = 0; i < data.length; i++) {
      const row = data[i];
      html += `<tr style="background-color: ${i % 2 ? '#eee' : '#fff'}">`;
      for (const cell of row) {
        html += `<td>${cell}</td>`;
      }
      html += '</tr>';
    }

    html += '</table>';
    return html;
  }
}
// задание 9 Filter Lexics
{
  function filterString(str, bannedWords) {
    const words = str.split(' '); // разбиваем строку на слова

    const filteredWords = words.filter((word) => !bannedWords.includes(word)); // фильтруем слова

    return filteredWords.join(' '); // собираем массив в строку
  }

  console.log(filterString('I want to eat ice cream', ['want', 'to']));
}
// задание 10 Currency Table
{
  function fetchAndCreateTable() {
    // Запрашиваем текущие курсы валют с сервера
    fetch('https://open.er-api.com/v6/latest/USD')
      .then((res) => res.json())
      .then((data) => {
        // Получаем объект с курсами валют
        const rates = data.rates;

        // Создаем массив для хранения кросскурсов
        const crossRates = [];

        // Добавляем заголовки таблицы в массив
        crossRates.push(['', ...Object.keys(rates)]);

        // Добавляем остальные строки таблицы в массив
        for (const currency1 in rates) {
          const row = [currency1];
          for (const currency2 in rates) {
            // Рассчитываем кросскурс между валютами
            const crossRate = rates[currency1] / rates[currency2];
            row.push(crossRate);
          }
          crossRates.push(row);
        }

        // Генерируем HTML-код таблицы
        const html = createTable(crossRates);

        // Вставляем HTML-код таблицы в документ
        document.getElementById('currencyTable').innerHTML = html;
      });
  }
}
// задание 11 Form
{
  function createFormFromObject(obj) {
    // создаем элемент формы
    let form = document.createElement('form');

    // итерируемся по ключам объекта
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        // получаем значение свойства
        const value = obj[key];
        // определяем тип инпута в зависимости от типа значения свойства
        let inputType;
        switch (typeof value) {
          case 'string':
            inputType = 'text';
            break;
          case 'number':
            inputType = 'number';
            break;
          case 'boolean':
            inputType = 'checkbox';
            break;
          default:
            inputType = 'text';
        }

        // создаем элементы label и input
        let label = document.createElement('label');
        let input = document.createElement('input');
        // устанавливаем тип инпута
        input.type = inputType;
        // устанавливаем значение инпута
        input.value = value;
        // добавляем текстовую надпись к элементу label
        label.appendChild(document.createTextNode(`${key}: `));
        // добавляем элемент input к элементу label
        label.appendChild(input);
        // добавляем элемент label к элементу form
        form.appendChild(label);
      }
    }

    // возвращаем элемент form
    return form;
  }
}
// задание 12 Array of objects sort
{
  function sort(arr, field, ascending = true) {
    arr.sort((a, b) => {
      if (ascending) {
        return a[field] > b[field] ? 1 : -1;
      } else {
        return a[field] < b[field] ? 1 : -1;
      }
    });
  }

  // пример использования функции

  var persons = [
    { name: 'Иван', age: 17 },
    { name: 'Мария', age: 35 },
    { name: 'Алексей', age: 73 },
    { name: 'Яков', age: 12 },
  ];

  // сортирует по возрасту по возрастанию
  sort(persons, 'age');
  console.log(persons); // [{name: "Яков", age: 12}, {name: "Иван", age: 17}, {name: "Мария", age: 35}, {name: "Алексей", age: 73}]

  // сортирует по имени по убыванию
  sort(persons, 'name', false);
  console.log(persons); // [{name: "Мария", age: 35}, {name: "Иван", age: 17}, {name: "Алексей", age: 73}, {name: "Яков", age: 12}]
}
// задание 13 Table
{
  function createTable(array, sortField, sortOrder) {
    // Копируем исходный массив
    const data = [...array];

    // Сортируем с помощью функции из предыдущего задания
    sort(data, sortField, sortOrder);

    // Первый проход - поиск колонок
    const columns = [];
    data.forEach((person) => {
      for (const key in person) {
        if (!columns.includes(key)) {
          columns.push(key);
        }
      }
    });

    // Начинаем создание таблицы
    let tableHTML = '<table><tr>';

    // Формируем строку с заголовками
    columns.forEach((column) => {
      tableHTML += `<th>${column}</th>`;
    });
    tableHTML += '</tr>';

    // Второй проход - отображение таблицы
    data.forEach((person) => {
      tableHTML += '<tr>';
      columns.forEach((column) => {
        tableHTML += `<td>${person[column]}</td>`;
      });
      tableHTML += '</tr>';
    });

    tableHTML += '</table>';

    console.log(tableHTML);
  }
}
// задание 14 Divide
{
  const calcResult = () => {
    const firstNumber = document.getElementById('firstNumber').value;
    const secondNumber = document.getElementById('secondNumber').value;
    const divisionResult = document.getElementById('divisionResult');

    divisionResult.innerHTML = Math.floor(firstNumber / secondNumber);
  };

  document.getElementById('firstNumber').oninput = calcResult;
  document.getElementById('secondNumber').oninput = calcResult;
}
// задание 15 Calc Func
{
  function calculateUtilitiesCost(
    utilitiesMonthOne,
    utilitiesMonthTwo,
    utilitiesMonthThree,
    utilitiesMonthFour,
    utilitiesMonthFive,
    utilitiesMonthSix,
  ) {
    let result =
      +utilitiesMonthOne +
      +utilitiesMonthTwo +
      +utilitiesMonthThree +
      +utilitiesMonthFour +
      +utilitiesMonthFive +
      +utilitiesMonthSix;
    return result;
  }

  let utilitiesCost = calculateUtilitiesCost(50, 60, 70, 80, 90, 100);
  console.log(utilitiesCost + ' грн');
}
// задание 16 Calc Live
{
  function calculateUtilitiesCost(
    utilitiesMonthOne,
    utilitiesMonthTwo,
    utilitiesMonthThree,
    utilitiesMonthFour,
    utilitiesMonthFive,
    utilitiesMonthSix,
  ) {
    let result =
      +utilitiesMonthOne +
      +utilitiesMonthTwo +
      +utilitiesMonthThree +
      +utilitiesMonthFour +
      +utilitiesMonthFive +
      +utilitiesMonthSix;
    return result;
  }

  const calcResult = () => {
    let utilitiesCost = calculateUtilitiesCost(
      utilitiesMonthOne.value,
      utilitiesMonthTwo.value,
      utilitiesMonthThree.value,
      utilitiesMonthFour.value,
      utilitiesMonthFive.value,
      utilitiesMonthSix.value,
    );
    utilitiesCostResult.innerHTML = `Стоимость коммунальных услуг: ${utilitiesCost} грн`;
  };

  utilitiesMonthOne.oninput =
    utilitiesMonthTwo.oninput =
    utilitiesMonthThree.oninput =
    utilitiesMonthFour.oninput =
    utilitiesMonthFive.oninput =
    utilitiesMonthSix.oninput =
      calcResult;
}
