// Материал
// Как обычно, запустите все примерчики из материала занятия, разберитесь что там и как работает, возьмите отладчик / консоль и поиграйтесь с ними.походу возможно найдутся ошибки, сообщите мне о них пожалуйста
{
    // сделано
}



// Temperature
// Оформите Temperature как функцию, в которую параметром передается температура в одной системе, а возвращается в другой.Никаких prompt и console.log в коде быть не должно, если вы хотите в дальнейшем пользоваться этой функцией где угодно в коде удобно.Нужен ли блок кода в функции для решения этой задачи ?
{
    const functionTemperature = (temperature, unit) => {
        let k
        unit.toLowerCase() === 'цельсий' ? k = 0 : unit.toLowerCase() === 'фаренгейт' ? k = 1 : alert('Вы ввели неправильну единицу измерения. Перепроверьте написание!')
        const temperatureConvertKelvin = `Указанная Вами температура соответствует: ${(1.8 * +temperature * (k + 1) + 32).toFixed(2)} в градусах Фаренгейта`
        const temperatureConvertCelsiy = `Указанная Вами температура соответствует: ${((+temperature - 32) / 1.8 * k).toFixed(2)} в градусах Цельсия`
        unit.toLowerCase() === 'цельсий' ? alert(temperatureConvertKelvin) : unit.toLowerCase() === 'фаренгейт' ? alert(temperatureConvertCelsiy) : alert('Один или несколько параметров введены неправильно')
    }

    functionTemperature(prompt('Укажите любое значение температуры (цифрами)'), prompt('Введите единицу измерения: Цельсий/Фаренгейт'))
}



// RGB
// Оформите Number: RGB как функцию, в которую параметрами передаются три числа(r, g, b) => . Функция должна возвращать строку в нотации #RRGGBB.Используя условия или тернарный оператор добейтесь что бы в результате всегда было 7 символов, даже когда значение цвета меньше 15ти.Нужен ли блок кода этой функции ?
{
    const colorConverter = ([red, green, blue]) => alert('Указанный Вами цвет для CSS: #' +
        ((+red) > 255 ? alert('Слишком большая цифра') : ((+red) < 16 ? + '0' + (+red).toString(16).toUpperCase() : (+red).toString(16).toUpperCase())) +
        ((+green) > 255 ? alert('Слишком большая цифра') : ((+green) < 16 ? + '0' + (+green).toString(16).toUpperCase() : (+green).toString(16).toUpperCase())) +
        ((+blue) > 255 ? alert('Слишком большая цифра') : ((+blue) < 16 ? + '0' + (+blue).toString(16).toUpperCase() : (+blue).toString(16).toUpperCase())))

    colorConverter(['Введите целое число 0 ... 255 для красного цвета', 'Введите целое число 0 ... 255 для зеленого цвета', 'Введите целое число 0 ... 255 для синего цвета'].map(prompt))
}



// Flats
// Оформите Number: flats как функцию.Продумайте достаточное количество параметров для решения задачи.Функция должна возвращать объект вида { entrance, floor }, где entrance - номер падика, floor - номер этажа на котором находится квартира.
{
    const numberFlats = ([numberOfFloors, numberOfFlats, searchingFlat]) => {
        const numberFlats = {}
        const searchingEntrance = Math.ceil(searchingFlat / ((+numberOfFloors) * +numberOfFlats))
        const searchingFloor = Math.ceil((+searchingFlat) / (+numberOfFlats) - (+numberOfFloors) * (searchingEntrance - 1))

        numberFlats.entrance = searchingEntrance
        numberFlats.floor = searchingFloor

        return numberFlats

    }

    numberFlats(['Введите количество этажей в доме:', 'Введите количество квартир на этаже:', 'Введите номер квартиры, которую нунжно найти:'].map(prompt))
}



// Credentials
// Оформите задание String: credentials как функцию без параметров.Используйте функцию capitalize из домашнего задания по массивам.Функция должна содержать вызовы prompt и возвращать объект вида { name, surname, fatherName, fullName }
{
    const enterPersonData = () => {
        const arr = {}

        const name = (prompt('Ввеедиет Ваше Имя в поле ниже')).trim()
        arr.name = `${name[0].toUpperCase()}${name.slice(1).toLowerCase()}`

        const surname = (prompt('Ввеедиет Вашу Фамилию в поле ниже')).trim()
        arr.surname = `${surname[0].toUpperCase()}${surname.slice(1).toLowerCase()}`

        const fatherName = (prompt('Ввеедиет Ваше Отчество в поле ниже')).trim()
        arr.fatherName = `${fatherName[0].toUpperCase()}${fatherName.slice(1).toLowerCase()}`

        const fullName = `${name[0].toUpperCase()}${name.slice(1).toLowerCase()} ${surname[0].toUpperCase()}${surname.slice(1).toLowerCase()} ${fatherName[0].toUpperCase()}${fatherName.slice(1).toLowerCase()}`
        arr.fullName = fullName

        return arr
    }

    enterPersonData()
}



// New line
// Оформите задание String: new line как функцию с параметром - строкой.Функция должна возвращать строку с настоящими переносами.
{
    const string = (str) => str.split('\\n').join('\n')
    alert(string(prompt('Введите в поле ниже любую строку. Для перехода на новую строку используйте комбинацию: \n')))
}



// Prompt OR
// Оформите задание Prompt: OR как функцию, которая принимает строку для prompt и значение по умолчанию.Функция должна возвращать введенный текст или значение по умолчанию в случае отказа пользователя вводить что - либо.Используйте функцию без блока кода(функцию в одно выражение)
{
    // const defaultValue = 
    const age = (insertData, defaultValue) => insertData !== null && insertData !== '' ? `Вы родились в ${2022 - +insertData} году` : defaultValue
    alert(age(prompt('Укажите в поле, сколько вам полных лет (цифрами):'), 'Вы не ввели ваш возраст!'))
}



// Login And Password
// Оформите задание Login And Password как функцию, которая принимает два параметра - правильный логин и пароль и возвращает true если логин и пароль введенные пользователями верны, или false если пользователь не смог.
{
    const autorization = (login, pass) => login === 'admin' && pass === 'qwerty'
    autorization(prompt('Введите в поле ниже логин'), prompt('Введите пароль в поле нижне'))
}



// For Table
// Оформите задание For Multiply Table как функцию, которая принимает любой массив с массивами, а возвращает строку HTML с тэгом < table > и всякими tr и td.
{
    newArr = [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8], [0, 3, 6, 9, 12], [0, 4, 8, 12, 16]]

    const table = (arr) => {
        let i = 0
        let str = `<table>`
        for (let string of arr) {
            str += (i % 2) ? `<tr style = "background-color:orange">` : `<tr style = "background-color:red">`
            i++
            for (let number of string) {
                str += `<td>${number}</td>`
            }
            str += `</tr>`
        }
        str += `</table>`

        return str
    }


    table(newArr)
}



// Filter Lexics  
// Оформите задание Filter Lexics как функцию, принимающую любую строку для проверки и массив некорректных слов(['бляха', 'муха', "пляха", "шабля"], например).Функция должна возвращать строку без этих некорректных слов.
{
    const string = 'Скоро бляха зима, ни одна муха на улицу не вылетит. Пляха - это шото, а шабля - это мощное оружие'
    const badWords = ['бляха', 'муха', "пляха", "шабля"]

    const checkString = (str, badArr) => {
        const result = str.toLowerCase().split(' ').filter(x => !badArr.includes(x) ? x : '')
        return result.join(' ')
    }

    checkString(string, badWords)
}



// Currency Table
// Оформите задание Currency Table как функцию, без параметров, которая складывает полученные данные во внутренний двумерный массив, после чего отображает его используя функцию из задания For Table
{
    const arrTable = () => {
        fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
            .then(data => {
                const arrRow = []
                for (let [key, value] of Object.entries(data.rates)) {
                    const arrData = []
                    arrData.push(key)

                    for (let num of Object.values(data.rates)) {
                        arrData.push(+((num / value).toFixed(4)))
                    }

                    arrRow.push(arrData)
                }

                const table = (arr) => {
                    let i = 0
                    const currencies = []
                    for (const currency in data.rates) {
                        currencies.push(currency)
                    }
                    // table header
                    let str = `<table style="text-align: center;">`
                    str += `<tr><td></td>`
                    for (const currency of currencies) {
                        str += `<td style="padding: 3px 10px;">${currency}</td>`
                    }
                    str += `</tr>`
                    // table body
                    for (let string of arr) {
                        str += !(i % 2) ? `<tr style = "background-color: #d1d1d1">` : `<tr>`
                        i++
                        for (let number of string) {
                            str += `<td style="padding: 0 10px;">${number}</td>`
                        }
                        str += `</tr>`
                    }
                    str += `</table>`

                    return str
                }

                document.write(table(arrRow))
            })
    }

    arrTable()
}



// Form
// Оформите задание Form как функцию, которая принимает любой объект как параметр и создает форму на экране.
{
    const enterForm = (insertObject) => {
        let str = `<form>`
        for (let [key, value] of Object.entries(insertObject)) {
            str += `<label>${key}: <input type="${typeof value === 'string' ? 'text' : typeof value === 'number' ? 'number' : 'checkbox'}" value="${value}" /></label></br></br>`
        }
        str += `</form>`

        return document.write(str)
    }

    // Объект для теста
    const car = {
        "Name": "chevrolet chevelle malibu",
        "Cylinders": 8,
        "Displacement": 307,
        "Horsepower": 130,
        "Weight_in_lbs": 3504,
        "Origin": "USA",
        "in_production": false
    }

    enterForm(car)
}



// Array of objects sort
// Сделайте обобщенную функцию сортировки массива с объектами
// Функция позволяет отсортировать любой набор данных по имени поля(второй параметр).Третьим параметром идет необязательный Boolean, который в случае true делает сортировку по возрастанию, в случае false - по убыванию.По умолчанию(без третьего параметра) происходит сортировка по возрастанию.
{
    const persons = [
        { name: "Иван", age: 17 },
        { name: "Мария", age: 35 },
        { name: "Алексей", age: 73 },
        { name: "Яков", age: 12 },
        { name: "Семен", age: 24 },
        { name: "Антон", age: 2 },
        { name: "Петр", age: 102 },
        { name: "Николай", age: 44 }
    ]

    const sort = (sortArr, sortKey, sortOrder) => {
        const sortFunction = (a, b) => {
            if (sortOrder !== false) {
                return a[sortKey] > b[sortKey] ? 1 : -1;
            } else {
                return a[sortKey] > b[sortKey] ? -1 : 1;
            }
        }

        const newSortArr = sortArr.slice().sort(sortFunction)
        return newSortArr
    }

    console.log(`Сортировка по возрасту (по возрастанию):`, sort(persons, "age"))
    console.log(`Сортировка по имени (по убыванию):`, sort(persons, "name", false))
}



// Table
// Оформите задание Table как функцию, которая принимает следующие параметры:   //done
// a. любой массив объектов для отображения                                     //done
// b. поле, по которому сортировать                                             //done
// c. порядок сортировки(убывание / возрастание)                                //done

// Перед отображением:
// a. скопируйте исходный массив, что бы сортировка не изменила оригинал;
// b. отсортируйте с помощью функции из предыдущего задания
// c. Отображение возьмите из задания Table
{
    const persons = [
        {
            name: 'Мария',
            fatherName: 'Ивановна',
            surname: 'Иванова',
            sex: 'female',
            // married: true,
            // age: 27
        },
        {
            name: 'Николай',
            fatherName: 'Иванович',
            surname: 'Иванов',
            age: 15,
            // sex: 'male',
            // married: false,

        },
        {
            name: 'Петр',
            fatherName: 'Иванович',
            surname: 'Иванов',
            married: true,
            // sex: 'male',
            // age: 31
        }
    ]

    const sort = (sortArr, sortKey, sortOrder) => {
        // copy origin arr
        let newSortArr = sortArr.slice()

        // sorting arr
        const sortFunction = (a, b) => {
            if (sortOrder !== false) {
                return a[sortKey] > b[sortKey] ? 1 : -1;
            } else {
                return a[sortKey] > b[sortKey] ? -1 : 1;
            }
        }
        newSortArr.sort(sortFunction)

        // create arr with items of header
        const keys = []
        for (const child of newSortArr) {
            for (const key in child) {
                if (!keys.includes(key)) {
                    keys.push(key);
                }
            }
        }

        // create table header
        let str = `<table style="border-collapse: collapse; text-align: center;"><tr style="background-color: grey;">`
        for (let key of keys) {
            str += `<td style="border: 1px solid black; padding: 5px 10px">${key}</td>`
        }
        str += `</tr>`

        // create table body
        for (const child of newSortArr) {
            str += `<tr>`
            for (const num of keys) {
                str += `<td style="border: 1px solid black; padding: 5px 10px">${(Object.keys(child)).includes(num) ? child[num] : ''}</td>`
            }
            str += `</tr>`
        }
        str += `</table>`

        // output table data
        document.write(str)

        return newSortArr
    }

    sort(persons, "name", false)
    console.log(`Исходный массив`, persons)
}



// Divide
// Реализуйте задание Number: divide в HTML:
{
    // реализовано в HTML файле HW07.html
}



// Calc Func
// Вспомните первое ДЗ по Javascript, в котором вы делали всякие расчеты используя код на Javascript.Оформите это как функцию:
//  найдите все входящие данные, сделайте из них параметры
//  найдите переменную с результатом расчетов и сделайте так, что бы ваша функция возвращала этот результат.
//      Если результатов несколько, создайте объект из этих результатов и верните его.
{
    const params = [
        {
            period: "day",
            lightUse: 100,
            rate: 144,
        },
        {
            period: "night",
            lightUse: 100,
            rate: 144,
        },
        {
            daysInMonth: 30
        }
    ]

    const dataElectrisity = (arr) => {
        const result = {}

        result.priceDay = (arr[0].lightUse * arr[0].rate * (arr[0].period === 'day' ? 1 : 0.5)) / 100
        result.priceNigth = (arr[1].lightUse * arr[1].rate * (arr[1].period === 'day' ? 1 : 0.5)) / 100
        result.priceMonth = result.priceDay + result.priceNigth
        result.usePerDay = +((arr[0].lightUse + arr[1].lightUse) / arr[2].daysInMonth).toFixed(2)

        return result
    }


    dataElectrisity(params)
}



// Calc Live
// Используя пример из задания Divide и функцию из Calc Func сделайте несколько полей ввода в HTML, меняя которые вы будете получать результат калькуляции в каком - то div.
{
    // реализовано в HTML файле HW07.html
}