<script setup>
import axios from 'axios';
import { onMounted, ref, computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { QSeparator, useQuasar } from 'quasar';
import { useRoute } from 'vue-router';
import { useNavigationStore } from 'src/stores/useNavigationStore';
import { toLowerCamel } from 'src/filters';
import routes from 'src/router/modules';
import LeftMenuItem from './LeftMenuItem.vue';
import LeftMenuItemGroup from './LeftMenuItemGroup.vue';

const { t } = useI18n();
const route = useRoute();
const quasar = useQuasar();
const navigation = useNavigationStore();

const props = defineProps({
    source: {
        type: String,
        default: 'main',
    },
});

onMounted(async () => {
    await navigation.fetchPinned();
    getRoutes();
});

function findMatches(search, item) {
    const matches = [];
    function findRoute(search, item) {
        for (const child of item.children) {
            if (search.indexOf(child.name) > -1) {
                matches.push(child);
            } else if (child.children) {
                findRoute(search, child);
            }
        }
    }

    findRoute(search, item);

    return matches;
}

function addChildren(module, route, parent) {
    if (route.menus) {
        const mainMenus = route.menus[props.source];
        const matches = findMatches(mainMenus, route);

        for (const child of matches) {
            navigation.addMenuItem(module, child, parent);
        }
    }
}

const pinnedItems = computed(() => {
    return items.value.filter((item) => item.isPinned);
});

const items = ref([]);
function getRoutes() {
    if (props.source === 'main') {
        const modules = Object.assign([], navigation.getModules().value);

        for (const item of modules) {
            const moduleDef = routes.find(
                (route) => toLowerCamel(route.name) === item.module
            );
            item.children = [];

            if (!moduleDef) continue;

            addChildren(item.module, moduleDef, item.children);
        }

        items.value = modules;
    }

    if (props.source === 'card') {
        const currentRoute = route.matched[1];
        const currentModule = toLowerCamel(currentRoute.name);
        const moduleDef = routes.find(
            (route) => toLowerCamel(route.name) === currentModule
        );

        if (!moduleDef) return;

        addChildren(currentModule, moduleDef, items.value);
    }
}

async function togglePinned(item, event) {
    if (event.defaultPrevented) return;
    event.preventDefault();
    event.stopPropagation();

    const data = { moduleName: item.module };
    const response = await axios.post('StarredModules/toggleStarredModule', data);

    item.isPinned = false;

    if (response.data && response.data.id) {
        item.isPinned = true;
    }

    navigation.togglePinned(item.module);

    quasar.notify({
        message: t('globals.dataSaved'),
        type: 'positive',
    });
}
</script>

<template>
    <QList padding>
        <template v-if="$props.source === 'main'">
            <QItemLabel header>
                {{ t('globals.pinnedModules') }}
            </QItemLabel>
            <template v-for="item in pinnedItems" :key="item.name">
                <template v-if="item.children">
                    <LeftMenuItemGroup :item="item" group="pinnedModules" class="pinned">
                        <template #side>
                            <QBtn
                                v-if="item.isPinned === true"
                                @click="togglePinned(item, $event)"
                                icon="remove_circle"
                                size="xs"
                                flat
                                round
                            >
                                <QTooltip>{{
                                    t('components.leftMenu.removeFromPinned')
                                }}</QTooltip>
                            </QBtn>
                            <QBtn
                                v-if="item.isPinned === false"
                                @click="togglePinned(item, $event)"
                                icon="push_pin"
                                size="xs"
                                flat
                                round
                            >
                                <QTooltip>{{
                                    t('components.leftMenu.addToPinned')
                                }}</QTooltip>
                            </QBtn>
                        </template>
                    </LeftMenuItemGroup>
                </template>

                <LeftMenuItem v-if="!item.children" :item="item" />
            </template>
            <QSeparator />
            <QExpansionItem :label="t('moduleIndex.allModules')">
                <template v-for="item in items" :key="item.name">
                    <template v-if="item.children">
                        <LeftMenuItemGroup :item="item" group="modules">
                            <template #side>
                                <QBtn
                                    v-if="item.isPinned === true"
                                    @click="togglePinned(item, $event)"
                                    icon="remove_circle"
                                    size="xs"
                                    flat
                                    round
                                >
                                    <QTooltip>
                                        {{ t('components.leftMenu.removeFromPinned') }}
                                    </QTooltip>
                                </QBtn>
                                <QBtn
                                    v-if="item.isPinned === false"
                                    @click="togglePinned(item, $event)"
                                    icon="push_pin"
                                    size="xs"
                                    flat
                                    round
                                >
                                    <QTooltip>
                                        {{ t('components.leftMenu.addToPinned') }}
                                    </QTooltip>
                                </QBtn>
                            </template>
                        </LeftMenuItemGroup>
                    </template>
                </template>
            </QExpansionItem>
            <QSeparator />
        </template>
        <template v-if="$props.source === 'card'">
            <template v-for="item in items" :key="item.name">
                <LeftMenuItem v-if="!item.children" :item="item" />
            </template>
        </template>
    </QList>
</template>

<style>
.pinned .icon-push_pin,
.pinned .icon-remove_circle {
    visibility: hidden;
}

.pinned:hover .icon-push_pin,
.pinned:hover .icon-remove_circle {
    visibility: visible;
}
</style>
