'use strict';

function events_list_item_deleting(evt, is_in_progress) {
    const item_delete_button_id = `delete-${evt.id}`;
    const delete_button = document.getElementById(item_delete_button_id);
    if (delete_button)
        delete_button.disabled = is_in_progress;
    else
        console.log(`events_list_item_deleting: (${is_in_progress}) Button ${item_delete_button_id} not found.`);
}

function events_list_item_deleted(evt) {
    const event_item = document.getElementById(evt.id);
    if (event_item)
        event_item.parentNode.removeChild(event_item);
    else
        console.log(`events_list_item_deleted: List item for ${evt.id} not found.`);
}

function events_list_delete(evt) {
    const lambdaApi = api_url("/meetings");
    lambdaApi.search = new URLSearchParams({
        meeting_id: evt.id,
        account: evt.ownerAccount
    }).toString();
    console.log(`events_list_delete: Deleting event ${lambdaApi.href}`);
    events_list_item_deleting(evt, true);
    fetch(lambdaApi.toString(), {
        method: "DELETE",
        headers: {"Authorization": `Bearer ${access_token}`}
    })
        .then(() => {
                console.log(`events_list_delete: Deleted ${lambdaApi.href}`);
                events_list_item_deleted(evt);
            },
            (reason) => {
                console.log(`events_list_delete: Delete ${lambdaApi.href} failed: ${reason}`);
                events_list_item_deleting(evt, false);
            });
}

function events_list_error(reason) {
    const events_list = document.getElementById("EventsList");
    events_list.appendChild(e("LI", {"class": "list-group-item error"}, t(`Error: ${reason}`)));
}

function events_list_loading() {
    const events_list = document.getElementById("EventsList");
    events_list.appendChild(e("LI", {"class": "list-group-item"}, t("Loading...")));
}

function events_list_fetch() {
    const lambdaApi = api_url("/meetings");
    const start_date = document.getElementById("start_date").value;
    const end_date = document.getElementById("end_date").value;
    lambdaApi.search = new URLSearchParams({
        threshold: "3",
        start: start_date,
        end: end_date
    }).toString();
    console.log(`events_list_fetch: Fetching events from ${lambdaApi.href}`);
    fetch(lambdaApi.href, {
        method: "GET",
        headers: {"Authorization": "Bearer " + access_token}
    })
        .then(res => res.json(),
            reason => {
                console.log(`events_list_fetch: Request failed: ${reason}`);
                events_list_clear();
                events_list_error(reason);
            })
        .then(result => {
            console.log(`events_list_fetch: Fetch events succeeded, returns ${result.RemovedEvents.length} events`);
            events_list_clear();
            if (result.RemovedEvents)
                events_list_show(result.RemovedEvents);
            else
                events_list_empty();
        }, reason => {
            console.log(`events_list_fetch: Parsing response failed: ${reason}`);
            events_list_clear();
            events_list_error(reason);
        });
    events_list_clear();
    events_list_loading();
}


function events_list_show(calendar_events) {
    function attendees_count(evt) {
        const cnt = evt.attendees ? evt.attendees.length : 0;
        return `${cnt} attendees`;
    }

    function toJSDate(ts) {
        // todo: remove when API is fixed to always use ISO.8601
        if (!ts.dateTime.endsWith("Z"))
            return new Date(`${ts.dateTime}Z`);
        else
            return new Date(ts.dateTime);
    }

    const events_list = document.getElementById("EventsList");

    function hours_between(start, end) {
        let duration = Math.abs(end.getTime() - start.getTime()) / (1000 * 60 * 60);
        duration = Math.round(duration * 100) / 100;
        return duration;
    }

    for (const evt of calendar_events) {
        const start = toJSDate(evt.start);
        const end = toJSDate(evt.end);
        const duration = hours_between(start, end);
        const li = e("LI",
            {
                "id": evt.id,
                "class": "list-group-item event"
            },
            e("DIV",
                {
                    "class": "event_info"
                },
                e("SPAN", {"class": "event_start_date"}, t(`${start.toLocaleString()}`)),
                e("SPAN", {"class": "event_duration"}, t(`${duration} hours`)),
                e("SPAN", {"class": "event_attendees"}, t(`${attendees_count(evt)}`))
            ),
            e("DIV", {"class": "event_title"},
                e("A",
                    {
                        href: evt.webLink,
                    },
                    t(evt.subject))),
            e("INPUT", {
                "id": `delete-${evt.id}`,
                type: "button",
                value: "Delete",
                onclick: () => {
                    events_list_delete(evt)
                }
            })
        );
        events_list.appendChild(li);
    }
}

function events_list_empty() {
    const events_list = document.getElementById("EventsList");
    events_list.appendChild(e("LI", {"class": "list-group-item"},
        t("No events")));
}

function events_list_clear() {
    const events_list = document.getElementById("EventsList");
    while (events_list.firstChild)
        events_list.firstChild.remove();
}

function accounts_list_item_deleting(account, is_in_progress) {
    const item_delete_button_id = `delete-${account.provider_name}-${account.user_name}`;
    const delete_button = document.getElementById(item_delete_button_id);
    if (delete_button)
        delete_button.disabled = is_in_progress;
    else
        console.log(`accounts_list_item_deleting: (${is_in_progress}) Button ${item_delete_button_id} not found.`);
}
