const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))

//trafficLight
//1stage
// let trafficLightContent = document.createElement('div')
// let signals = document.createElement('div')
// let red = document.createElement('img')
// let yellow = document.createElement('img')
// let green = document.createElement('img')
// signals.append(red)
// signals.append(yellow)
// signals.append(green)

// trafficLightContent.append(signals)
// document.body.append(trafficLightContent)
// red.hidden = 'true'
// yellow.hidden = 'true'
// green.hidden = 'true'

// red.src = 'img/red.png'
// red.style.width = '300px'
// red.style.position = 'relative'
// red.style.right = '31px'

// yellow.src = 'img/yellow.png'
// yellow.style.width = '190px'
// green.src = 'img/green.png'
// green.style.width = '200px'
// green.style.position = 'relative'
// green.style.right = '5px'
// green.style.top = '-5px'

// async function trafficLight(){
//     while (true){
//         redColor()
//         await delay(5000)
//         yellowColor()
//         await delay(3000)
//         greenColor()
//         await delay(5000)
//     }
// }


// function cleaner () {
//     red.hidden = 'true'
//     yellow.hidden = 'true'
//     green.hidden = 'true'
// }

// function redColor() {
//     cleaner()
//     red.removeAttribute('hidden')
// }

// function yellowColor(){
//     cleaner()
//     yellow.removeAttribute('hidden')
// }

// function greenColor () {
//     cleaner()
//     green.removeAttribute('hidden')
// }

// trafficLight()

//2stage

//dom
let trafficLightContent = document.createElement('div')
let signals = document.createElement('div')
let signalsPed = document.createElement('div')
let btnContent = document.createElement('div')
let br = document.createElement('br')
btnContent.style.marginTop = '90px'
signalsPed.style.marginTop = '100px'
let red = document.createElement('img')
let yellow = document.createElement('img')
let green = document.createElement('img')
let greenPed = document.createElement('img')
greenPed.style.width = '180px'
let redPed = document.createElement('img')
redPed.style.width = '180px'
greenPed.src = 'img/greenped.png'
greenPed.hidden = 'true'
greenPed.style.marginLeft = '10px'
redPed.src = 'img/redped.png'
let btn = document.createElement('button')
btn.innerHTML = 'I want to cross <br \/> the pedestrian <br \/> crossing'
signals.append(red)
signals.append(yellow)
signals.append(green)
btnContent.append(btn)
signalsPed.append(greenPed)
signalsPed.append(redPed)

//btnsettings
btn.style.backgroundColor = 'red'
btn.style.border = '2px solid black'
btn.style.color = 'white'
btn.style.padding = '20px'
btn.style.textAlign = 'center'
btn.style.textDecoration = 'none'
btn.style.display = 'inline-block'
btn.style.fontSize = '16px'
btn.style.cursor = 'pointer'
btn.style.borderRadius = '100%'
btn.style.marginLeft = '20px'
//btnsettingsend

trafficLightContent.append(signals)
trafficLightContent.append(btnContent)
trafficLightContent.append(signalsPed)
document.body.append(trafficLightContent)
red.hidden = 'true'
yellow.hidden = 'true'
green.hidden = 'true'

red.src = 'img/red.png'
red.style.width = '300px'
red.style.position = 'relative'
red.style.right = '31px'

yellow.src = 'img/yellow.png'
yellow.style.width = '190px'
green.src = 'img/green.png'
green.style.width = '200px'
green.style.position = 'relative'
green.style.right = '5px'
green.style.top = '-5px'

//functions
function randTime(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min)) + min; //Максимум не включается, минимум включается
  }

async function trafficLight(color, time){
    while (true){
        onColor(green)
        let p = Promise.race([
            new Promise((resolve,reject)=>{resolve(delay(5000))}),
            new Promise((resolve,reject)=>{resolve(domEventPromise(btn,'click'))}),
        ])
        await p 
        onColor(yellow)
        await delay(time = 3000)
        onColor(red)
        await delay(time = randTime(3000,10000))
        onColor(yellow)
        await delay(time = randTime(3000,5000))
        disabler()
    }
}

const disabler = btn.onclick = function() {
    btn.disabled = true
    setTimeout(function() {
       btn.disabled = false
    }, 20000); 
}

const domEventPromise = function (element , eventName){
    return new Promise (function (resolve, reject) {
        let someObject
        element.addEventListener(eventName , someObject = (event) =>{
            resolve(event)
            element.removeEventListener(eventName,someObject)
        } )
    })
}

function cleaner () {
    red.hidden = 'true'
    yellow.hidden = 'true'
    green.hidden = 'true'
    greenPed.hidden = 'true'
    redPed.removeAttribute('hidden')
}

function onColor (color) {
    cleaner()
    if (color === green) {
        green.removeAttribute('hidden')
    }
    else if (color === yellow) {
        yellow.removeAttribute('hidden')
    }
    else if(color === red){
        red.removeAttribute('hidden')
        redPed.hidden = 'true'
        greenPed.removeAttribute('hidden')
    }
} 

trafficLight()

//speedtest
// async function speedtest(getPromise, count ,parallel=1){
    //     let duration 
//     let querySpeed
//     let queryDuration
//     let parallelSpeed
//     let parallelDuration

    
//     let t0 = performance.now()
//     for (let i = 0; i < count; i++){
//         let promiseArr = []
//         for (let all = 0;all < parallel;all++){
//             promiseArr.push(getPromise())
//         }
//         await Promise.all(promiseArr)
//         console.log(promiseArr)
//     }
//     let t1 = performance.now()
    
//     duration = t1-t0
//     parallelSpeed = count*parallel / duration
//     parallelDuration = 1/parallelSpeed
//     queryDuration = duration/count
//     querySpeed = 1/queryDuration

//         return {
//             duration,
//             querySpeed, //средняя скорость одного запроса
//             queryDuration, //
//             parallelSpeed,
//             parallelDuration
//         }
//     }

//     // speedtest(() => delay(1000), 10, 10 ).then(result => console.log(result))
//     // {duration: 10000, 
//     // querySpeed: 0.001, //1 тысячная запроса за миллисекунду
//     // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем 
//     // parallelSpeed: 0.01  // 100 запросов за 10000 миллисекунд
//     // parallelDuration: 100 // 100 запросов за 10000 миллисекунд
//     speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5).then(result => console.log(result))