let CONTENTS = null
init()

async function init() {

    const params = new URLSearchParams(window.location.search);
    const activeList = params.get("list")
    console.log("activeList", activeList)


    await Promise.all([
        placeCSS("style"),
        placeJS("ui"),
    ])

    let post = ""

    if (window.location.pathname.endsWith(".html")) {
        // this is a link to a post
        //look at the current post to see what to do 
        post = document.querySelector(".post")
        post.querySelector("div").querySelector("div").remove()
        post.querySelector("div").querySelector("div").remove()
        post = post.querySelector("div").innerHTML

        try {
            post = jsyaml.load(post)
            console.log(post)
        } catch (e) {
            // post was not yaml or json.  get TOC
            console.log("ERROR", e)
            post = ""
        }
    }

    if (!post) {
        // no post yet, get default TOC
        post = await postToObject("toc")

    }



    console.log("post", post)
    if (post.playlists) {
        // this is a set of playlists
        CONTENTS = post
        document.body.innerHTML = `<div class="header"><span id="title">${params.get("label") || post.title || "Class Videos"} </span> </span><span id="playlist-length"></span><select id="playlists" onchange="placeVideos()"></select></div><div id="content"></div>`
        let entryNumber = 0
        for (const playlist of post.playlists) {
            console.log(playlist.title)
            const opt = document.createElement('option');
            opt.value = entryNumber++;
            opt.innerHTML = playlist.title;
            if (playlist.title === activeList) { opt.selected = "selected" }
            tag("playlists").appendChild(opt);
        }

        console.log("active", tag("playlists").selectedIndex)
        placeVideos()
    } else if (post.videos) {
        // this is a single playlist
        document.body.innerHTML = `<div class="header"><span id="title">${params.get("label") || post.title || "Class Videos"} </span><span id="playlist-length"></span> </div><div id="content"></div>`
        placeVideos(post.videos)

    } else if (post.video) {
        // this is a video file
        document.body.innerHTML = `<div id="content" style="margin-top:1rem"></div>`
        tag("content").appendChild(ui.tag("div", { id: post.video }))
        placeVideo(post, post.video)
        document.title = post.title
    } else {
        console.error("the post was valid json or yaml but not an expected format")
    }
}

function updatePlaylistTime(seconds){
    if(tag("playlist-length")){
        let timeString="0"
        if(tag("playlist-length").innerHTML){
        timeString=tag("playlist-length").innerHTML.slice(1,-1)
        }

        tag("playlist-length").innerHTML = "(" + secondsToTime(+(timeString.split(':').reduce((acc,time) => (60 * acc) + +time))+seconds) + ")"
    }
}

function placeVideos(videoArray) {
    tag("content").replaceChildren()
    let vidNum = 1
    for (videoID of videoArray) {
        const vidTag = ui.tag("div", { id: postID(videoID) })
        vidTag.dataset.sequence = vidNum++
        tag("content").appendChild(vidTag)
        placeVideo(videoID, postID(videoID))
    }
}

function addCode(summary, details) {
    return ui.tag("details",
        ui.tag("summary", summary),

        ui.tag("div", { className: "code-pane" }, ui.tag("div", details), ui.tag("button", { onclick: copy, className: "copy-button" }, "Copy"))
    )
}

function addExtra(summary, details) {
    const parser = new DOMParser()
    return ui.tag("details",
        ui.tag("summary", summary),
        parser.parseFromString(details, `text/html`).body
    )
}


async function placeVideo(videoOrVideoID, divId) {
    let video = videoOrVideoID
    if (typeof videoOrVideoID === "string") {
        video = jsyaml.load(await blogPost(videoOrVideoID))
    }

    const videoID = video.video
    updatePlaylistTime(video.seconds)
    const content = []
    if (video.code) {
        for (detail of video.code) {
            content.push(addCode(htmlDecode(detail.summary), htmlDecode(detail.detail)))
        }
    }

    if (video.extras) {
        for (extra of toArray(video.extras)) {
            console.log("extra", extra)
            content.push(addExtra(extra.label, await blogPost(extra.postId)))
        }
    }

    if (video.transcript) {
        content.push(addCode("Video Transcript", video.transcript))
    }

    let prior_videos = ""

    if (video.prior) {
        const links = []
        for (prior_video of toArray(video.prior)) {

            if (!tag(postID(prior_video))) {
                links.push(
                    ui.tag("p", { className: "link-holder", id: postID(prior_video) },
                        ui.tag("a", { href: `${window.location.protocol}//${window.location.host}/2022/02/${postID(prior_video)}.html`, target: "_blank" }, prior_video),
                        ui.tag("br")
                    )
                )
            }
        }
        if (links.length > 0) {
            prior_videos = ui.tag("details",
                ui.tag("summary", "Prior Videos"),
                ui.tag("div", { className: "prior-links" }, ...links)
            )
        }

    }
    const iframe = ui.tag("iframe",
        {
            frameborder: "0",
            height: "400",
            width: "700",
            src: `https://www.youtube.com/embed/${video.video}?feature=player_embedded&rel=0`,
        }
    )
    iframe.setAttribute("allowFullScreen", "")

    console.log("prior_videos", prior_videos)
    let videoTitle = video.title
    if (tag(divId)?.dataset?.sequence) {
        videoTitle = tag(divId).dataset.sequence + ". " + videoTitle
    }
    const div = ui.tag("div", { className: "video-tile" },
        ui.tag("div", { className: "video-panel" },

            ui.tag("div", { className: "video-title" }, videoTitle), prior_videos,
            iframe,
            ...content
        )
    )
    tag(divId).appendChild(div)
}

function tag(id) {
    return document.getElementById(id)
}

async function placeHTML(pageName) {
    const parser = new DOMParser()
    document.body.replaceWith(parser.parseFromString(await blogPost(pageName), `text/html`).body)
}

async function postToObject(pageName, objectVar) {
    if (objectVar === undefined) {
        return jsyaml.load(await blogPost(pageName))
    } else {
        for (const [key, val] of Object.entries(jsyaml.load(await blogPost(pageName)))) {
            objectVar[key] = val
        }
    }
}

async function placeCSS(pageName) {
    const css = document.createElement(`style`)
    css.innerHTML = await blogPost(pageName)
    document.head.appendChild(css)
}

async function placeJS(pageName) {
    const js = document.createElement(`script`)
    js.replaceChildren(atob(await blogPost(pageName)))
    document.getElementsByTagName(`head`)[0].appendChild(js)

}


async function blogPost(name) {
    return await (getPost(`2022/02/${postID(name)}.html`))
}

function copy(evt) {
    for (const button of document.querySelectorAll(".copy-button")) {
        button.innerHTML = "Copy"
    }
    navigator.clipboard.writeText(evt.target.previousElementSibling.innerText).then(evt.target.innerHTML = "Copied")
}

function postID(postTitle) {
    //converts a post title to a post id
    console.log("postTitle", postTitle)
    return postTitle.toLowerCase().split(" ").join("-").split("_").join("")
}

function toArray(data) {
    if (Array.isArray(data)) return data
    return [data]
}

function htmlDecode(input) {
    var doc = new DOMParser().parseFromString(input, "text/html");
    return doc.documentElement.textContent;
}

function submitData(evt) {
    //used to submit data to a google form
    let elem = evt.target
    while (elem.tagName.toUpperCase() !== "FORM") {
        elem = elem.parentNode
    }

    const data = {}
    const body = [`entry.2015575826=${elem.dataset.action}`]
    let errorCount = 0
    //validate
    for (const input of elem.querySelectorAll(".form-element")) {
        input.nextElementSibling.innerHTML = ""
        if (input.value.length === 0) {
            if (input.dataset.required) {
                input.nextElementSibling.innerHTML = "Requred."
                errorCount++
            }
        } else {
            if (input.dataset.type) {
                const message = validate(input.dataset.type, input.value)
                if (message) {
                    input.nextElementSibling.innerHTML = message
                    errorCount++
                }
            }
        }
    }

    if (errorCount > 0) {
        return
    }

    // passed validations 
    // build body for submission
    for (const input of elem.querySelectorAll(".form-element")) {
        data[input.id] = input.value
        if (input.dataset.formId) {
            body.push(`${input.dataset.formId}=${encodeURIComponent(input.value)}`)
        }
    }

    body.push(`${elem.dataset.id}=${encodeURIComponent(JSON.stringify(data))}`)
    console.log("data", data)
    console.log("body", body.join("&"))

    fetch(elem.action,
        {
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
            },
            mode: "no-cors",
            method: "POST",
            body: body.join("&")
        })
        .then(res => {
            console.log("Form Submitted")
            while (elem.className !== "submit-data") {
                elem = elem.parentNode
            }
            elem.innerHTML = "Information Submitted.  Thank you."
        })

}

function validate(type, value) {
    if (type === "netid") {
        if (isValidNetId(value)) {
            return null
        } else {
            return "Must be a valid BYU NetID"
        }
    } else if (type === "url") {
        if (isValidUrl(value)) {
            return null
        } else {
            return "Must be a valid URL"
        }
    } else if (type === "ip-address") {
        if (isValidIpAddress(value)) {
            return null
        } else {
            return "Must be a valid IP Address"
        }
    }
}

function isValidIpAddress(ipaddress) {  
    if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress)) {  
      return (true)  
    }  
    alert("You have entered an invalid IP address!")  
    return (false)  
  } 

function isValidNetId(string) {
    return string.match(/^[a-zA-Z][a-zA-Z0-9]*$/g)
}

function isValidUrl(string) {
    try {
        new URL(string);
        return true;
    } catch (err) {
        return false;
    }
}

function secondsToTime(secs)
{
    var t = new Date(1970,0,1);
    t.setSeconds(secs);
    var s = t.toTimeString().substr(0,8);
    if(secs > 86399)
        s = Math.floor((t - Date.parse("1/1/70")) / 3600000) + s.substr(2);
    return s;
}