// ДЗ: Функции
// задание 1 Arrow to Functions
{
  // выполнено в предыдущем дз по функциям
}

// задание 2 createPerson
{
  function createPerson(name, surname) {
    const person = {
      name,
      surname,
      getFullName() {
        return `${this.name} ${this.surname} ${this.fatherName || ''}`;
      },
    };
    return person;
  }
}

// задание 3 createPersonClosure
{
  function createPersonClosure(name, surname) {
    let fatherName;
    let age;

    function getName() {
      return name;
    }

    function getSurname() {
      return surname;
    }

    function getFatherName() {
      return fatherName;
    }

    function getAge() {
      return age;
    }

    function getFullName() {
      return `${name} ${surname} ${fatherName || ''}`;
    }

    function setName(newName) {
      if (typeof newName === 'string' && newName[0] === newName[0].toUpperCase()) {
        name = newName;
        return name;
      }
      return name;
    }

    function setSurname(newSurname) {
      if (typeof newSurname === 'string' && newSurname[0] === newSurname[0].toUpperCase()) {
        surname = newSurname;
        return surname;
      }
      return surname;
    }

    function setFatherName(newFatherName) {
      if (
        typeof newFatherName === 'string' &&
        newFatherName[0] === newFatherName[0].toUpperCase()
      ) {
        fatherName = newFatherName;
        return fatherName;
      }
      return fatherName;
    }

    function setAge(newAge) {
      if (typeof newAge === 'number' && newAge >= 0 && newAge <= 100) {
        age = newAge;
        return age;
      }
      return age;
    }

    function setFullName(newFullName) {
      const parts = newFullName.split(' ');
      if (parts.length === 3) {
        if (
          typeof parts[0] === 'string' &&
          parts[0][0] === parts[0][0].toUpperCase() &&
          typeof parts[1] === 'string' &&
          parts[1][0] === parts[1][0].toUpperCase() &&
          typeof parts[2] === 'string' &&
          parts[2][0] === parts[2][0].toUpperCase()
        ) {
          surname = parts[0];
          name = parts[1];
          fatherName = parts[2];
        }
      } else if (parts.length === 2) {
        if (
          typeof parts[0] === 'string' &&
          parts[0][0] === parts[0][0].toUpperCase() &&
          typeof parts[1] === 'string' &&
          parts[1][0] === parts[1][0].toUpperCase()
        ) {
          surname = parts[0];
          name = parts[1];
        }
      }
      return getFullName();
    }

    return {
      getName,
      getSurname,
      getFatherName,
      getAge,
      getFullName,
      setName,
      setSurname,
      setFatherName,
      setAge,
      setFullName,
    };
  }
}

// задание 4 createPersonClosureDestruct
{
  function createPersonClosureDestruct({
    name = 'Имя не указано',
    surname = 'Фамилия не указана',
    age = 0,
    fatherName,
  }) {
    let ageValue = age;
    let fatherNameValue = fatherName;

    function getName() {
      return name;
    }

    function getSurname() {
      return surname;
    }

    function getFatherName() {
      return fatherNameValue;
    }

    function getAge() {
      return ageValue;
    }

    function getFullName() {
      return `${name} ${surname} ${fatherNameValue || ''}`;
    }

    function setName(newName) {
      if (typeof newName === 'string' && newName[0] === newName[0].toUpperCase()) {
        name = newName;
        return name;
      }
      return name;
    }

    function setSurname(newSurname) {
      if (typeof newSurname === 'string' && newSurname[0] === newSurname[0].toUpperCase()) {
        surname = newSurname;
        return surname;
      }
      return surname;
    }

    function setFatherName(newFatherName) {
      if (
        typeof newFatherName === 'string' &&
        newFatherName[0] === newFatherName[0].toUpperCase()
      ) {
        fatherNameValue = newFatherName;
        return fatherNameValue;
      }
      return fatherNameValue;
    }

    function setAge(newAge) {
      if (typeof newAge === 'number' && newAge >= 0 && newAge <= 100) {
        ageValue = newAge;
        return ageValue;
      }
      return ageValue;
    }

    function setFullName(newFullName) {
      const parts = newFullName.split(' ');
      if (parts.length === 3) {
        if (
          typeof parts[0] === 'string' &&
          parts[0][0] === parts[0][0].toUpperCase() &&
          typeof parts[1] === 'string' &&
          parts[1][0] === parts[1][0].toUpperCase() &&
          typeof parts[2] === 'string' &&
          parts[2][0] === parts[2][0].toUpperCase()
        ) {
          surname = parts[0];
          name = parts[1];
          fatherNameValue = parts[2];
        }
      } else if (parts.length === 2) {
        if (
          typeof parts[0] === 'string' &&
          parts[0][0] === parts[0][0].toUpperCase() &&
          typeof parts[1] === 'string' &&
          parts[1][0] === parts[1][0].toUpperCase()
        ) {
          surname = parts[0];
          name = parts[1];
        }
      }
      return getFullName();
    }

    return {
      getName,
      getSurname,
      getFatherName,
      getAge,
      getFullName,
      setName,
      setSurname,
      setFatherName,
      setAge,
      setFullName,
    };
  }
}

// задание 5 isSorted
{
  function isSorted(...values) {
    if (values.length === 0) {
      return true;
    }
    for (let i = 1; i < values.length; i++) {
      if (typeof values[i] !== 'number' || values[i] < values[i - 1]) {
        return false;
      }
    }
    return true;
  }
}

// задание 6 Test isSorted
{
  const values = [];

  while (true) {
    const value = prompt('Введите число или нажмите ОК, чтобы закончить ввод');
    if (value === null) {
      break;
    }
    values.push(Number(value));
  }

  console.log(isSorted(...values));
}

// задание 7 personForm
{
  function personForm(parent, person) {
    // создаем поля ввода
    const nameInput = document.createElement('input');
    const surnameInput = document.createElement('input');
    const fatherNameInput = document.createElement('input');
    const ageInput = document.createElement('input');
    const fullNameInput = document.createElement('input');

    // добавляем поля ввода в родительский элемент
    parent.appendChild(nameInput);
    parent.appendChild(surnameInput);
    parent.appendChild(fatherNameInput);
    parent.appendChild(ageInput);
    parent.appendChild(fullNameInput);

    // устанавливаем начальные значения полей ввода
    nameInput.value = person.getName();
    surnameInput.value = person.getSurname();
    fatherNameInput.value = person.getFatherName();
    ageInput.value = person.getAge();
    fullNameInput.value = person.getFullName();

    // навешиваем обработчики событий на поля ввода
    nameInput.oninput = () => {
      person.setName(nameInput.value);
      nameInput.value = person.getName();
    };
    surnameInput.oninput = () => {
      person.setSurname(surnameInput.value);
      surnameInput.value = person.getSurname();
    };
    fatherNameInput.oninput = () => {
      person.setFatherName(fatherNameInput.value);
      fatherNameInput.value = person.getFatherName();
    };
    ageInput.oninput = () => {
      person.setAge(ageInput.value);
      ageInput.value = person.getAge();
    };
    fullNameInput.oninput = () => {
      person.setFullName(fullNameInput.value);
      fullNameInput.value = person.getFullName();
    };
  }
}

// задание 8 getSetForm
{
  function personForm(parent, obj) {
    // создаем общий реестр полей
    const fields = {};

    // итерируем объект
    for (const [key, value] of Object.entries(obj)) {
      // определяем имя поля и тип (get или set)
      const fieldName = key.slice(3);
      const type = key.slice(0, 3);

      // если тип - get, то создаем поле ввода и устанавливаем значение
      if (type === 'get') {
        fields[fieldName] = document.createElement('input');
        fields[fieldName].value = value();

        // добавляем поле ввода в родительский DOM-элемент
        parent.appendChild(fields[fieldName]);
      }

      // если тип - set, то устанавливаем обработчик события на поле ввода соответствующего имени
      if (type === 'set') {
        fields[fieldName].oninput = () => {
          // вызываем функцию set... и заносим ее результат обратно в инпут
          fields[fieldName].value = value(fields[fieldName].value);
        };
      }
    }
  }
}
