// entry - a track, directory, playlist, etc
// - entries
// - name
// - length

import List from "./List.js"
import * as panels from "./panels.js"

const app = window.app ??= {}
const view = window.view ??= {}

export let list = new List(view.browser = {
    element: document.getElementById('browser')
})

export const Init = async () => {
    app.browser = {}
    app.browser.root = {
        entries: app.index,
        root: true
    }
    app.browser.current = app.browser.root
    app.browser.recursiveView = false
    app.browser.view = []
}

export const View = async () => {
    Render()
}

export const Render = async () => {
    organizeView()
    list.Render(app.browser.view, 0)
}

export const organizeView = () => {
    if(app.browser.recursiveView) {
        app.browser.view = []
        recurseView()
    } else {
        app.browser.view = app.browser.current.entries
    }
    app.browser.view.sort((a, b) => a.order - b.order)
}

export const recurseView = (eaEntries = app.browser.current.entries, bIncludeDirectories = true) => {
    for(let e of eaEntries) {
        if(e.entries) {
            recurseView(e.entries, false)
            if(!bIncludeDirectories)
                continue
        }
        app.browser.view.push(e)
    }
}

export const Open = () => {
    panels.Display('browser')
}

export const Back = () => {
    let e = app.browser.current
    if(e.root) {
        return
    }
    let s = Cd(e.parent)
    
    if(s) {
        list.Focus(app.browser.view.indexOf(e))
    }
}

export const Cd = (entry = Focused() || app.browser.root) => {
    if(entry.entries) {
        app.browser.current = entry
        Render()

        return true
    } else {
        return false
    }
}

export const Queue = (entry = Focused()) => {
    queue.Add(entry)
    list.Scroll(1)
}

export const QueueAllBelow = () => {
    let e = app.browser.current.entries

    for(let i = app.cursor; i < e.length; i++) {
        queue.Add(e)
    }
}

export const GoToDirectory = (entry = Focused()) => {
    Cd(entry.parent) &&
        list.Focus(app.browser.view.indexOf(entry))
}

export const ToggleRecursiveView = () => {
    app.browser.recursiveView = !app.browser.recursiveView
    Render() 
}

export const Focused = () => {
    return app.browser.view[view.browser.cursor]
}