<script setup>
import { onBeforeMount, computed, watchEffect } from 'vue';
import { useRoute, onBeforeRouteUpdate } from 'vue-router';
import { useArrayData } from 'src/composables/useArrayData';
import { useStateStore } from 'stores/useStateStore';
import useCardSize from 'src/composables/useCardSize';
import VnSubToolbar from '../ui/VnSubToolbar.vue';
import VnSearchbar from 'components/ui/VnSearchbar.vue';
import LeftMenu from 'components/LeftMenu.vue';
import RightMenu from 'components/common/RightMenu.vue';

const props = defineProps({
    dataKey: { type: String, required: true },
    baseUrl: { type: String, default: undefined },
    customUrl: { type: String, default: undefined },
    filter: { type: Object, default: () => {} },
    descriptor: { type: Object, required: true },
    filterPanel: { type: Object, default: undefined },
    searchDataKey: { type: String, default: undefined },
    searchUrl: { type: String, default: undefined },
    searchbarLabel: { type: String, default: '' },
    searchbarInfo: { type: String, default: '' },
    searchCustomRouteRedirect: { type: String, default: undefined },
    searchRedirect: { type: Boolean, default: true },
});

const stateStore = useStateStore();
const route = useRoute();
const url = computed(() => {
    if (props.baseUrl) return `${props.baseUrl}/${route.params.id}`;
    return props.customUrl;
});

const arrayData = useArrayData(props.dataKey, {
    url: url.value,
    filter: props.filter,
});

onBeforeMount(async () => {
    if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id };
    await arrayData.fetch({ append: false });
});

if (props.baseUrl) {
    onBeforeRouteUpdate(async (to, from) => {
        if (to.params.id !== from.params.id) {
            arrayData.store.url = `${props.baseUrl}/${to.params.id}`;
            await arrayData.fetch({ append: false });
        }
    });
}

watchEffect(() => {
    if (Array.isArray(arrayData.store.data))
        arrayData.store.data = arrayData.store.data[0];
});
</script>
<template>
    <template v-if="stateStore.isHeaderMounted()">
        <Teleport to="#searchbar" v-if="props.searchDataKey">
            <slot name="searchbar">
                <VnSearchbar
                    :data-key="props.searchDataKey"
                    :url="props.searchUrl"
                    :label="props.searchbarLabel"
                    :info="props.searchbarInfo"
                    :custom-route-redirect-name="searchCustomRouteRedirect"
                    :redirect="searchRedirect"
                />
            </slot>
        </Teleport>
        <slot v-else name="searchbar" />
        <QDrawer v-model="stateStore.leftDrawer" show-if-above :width="256">
            <QScrollArea class="fit">
                <component :is="descriptor" />
                <QSeparator />
                <LeftMenu source="card" />
            </QScrollArea>
        </QDrawer>
        <RightMenu>
            <template #right-panel v-if="props.filterPanel">
                <component :is="props.filterPanel" :data-key="props.searchDataKey" />
            </template>
        </RightMenu>
    </template>
    <QPageContainer>
        <QPage>
            <VnSubToolbar />
            <div :class="[useCardSize(), $attrs.class]">
                <RouterView />
            </div>
        </QPage>
    </QPageContainer>
</template>
