<script setup>
import { useRoute, useRouter } from 'vue-router';
import { onBeforeMount, reactive, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { useDialogPluginComponent } from 'quasar';

import FormModelPopup from 'components/FormModelPopup.vue';
import FetchData from 'components/FetchData.vue';
import VnRow from 'components/ui/VnRow.vue';
import VnSelect from 'components/common/VnSelect.vue';
import VnInputDate from 'components/common/VnInputDate.vue';

import { useState } from 'composables/useState';
import axios from 'axios';

const { t } = useI18n();
const route = useRoute();
const router = useRouter();
const state = useState();
const user = state.getUser();
defineEmits(['confirm', ...useDialogPluginComponent.emits]);

const initialFormState = reactive({
    clientId: Number(route.query?.clientFk) || null,
    addressId: null,
    agencyModeId: null,
    warehouseId: user.value.warehouseFk,
    landed: null,
});
const agenciesOptions = ref([]);
const addressesOptions = ref([]);
const warehousesOptions = ref([]);
const selectedClient = ref(null);

onBeforeMount(async () => {
    await onClientSelected(initialFormState);
});

const fetchClient = async (formData) => {
    try {
        const filter = {
            include: {
                relation: 'defaultAddress',
                scope: {
                    fields: ['id', 'agencyModeFk'],
                },
            },
            where: { id: formData.clientId },
        };
        const params = { filter: JSON.stringify(filter) };
        const { data } = await axios.get('Clients', { params });
        const [client] = data;
        selectedClient.value = client;
    } catch (err) {
        console.error('Error fetching client');
    }
};

const fetchAddresses = async (formData) => {
    try {
        if (!formData.clientId) return;

        const filter = {
            fields: ['nickname', 'street', 'city', 'id'],
            where: { isActive: true },
            order: 'nickname ASC',
        };
        const params = { filter: JSON.stringify(filter) };
        const { data } = await axios.get(`Clients/${formData.clientId}/addresses`, {
            params,
        });
        addressesOptions.value = data;

        const { defaultAddress } = selectedClient.value;
        formData.addressId = defaultAddress.id;
    } catch (err) {
        console.error(`Error fetching addresses`, err);
        return err.response;
    }
};

const onClientSelected = async (formData) => {
    await fetchClient(formData);
    await fetchAddresses(formData);
};

const fetchAvailableAgencies = async (formData) => {
    if (!formData.warehouseId || !formData.addressId || !formData.landed) return;
    let params = {
        warehouseFk: formData.warehouseId,
        addressFk: formData.addressId,
        landed: formData.landed,
    };

    const { data } = await axios.get('Agencies/getAgenciesWithWarehouse', { params });

    agenciesOptions.value = data;

    const defaultAgency = agenciesOptions.value.find(
        (agency) =>
            agency.agencyModeFk === selectedClient.value.defaultAddress.agencyModeFk
    );

    if (defaultAgency) formData.agencyModeId = defaultAgency.agencyModeFk;
};

const redirectToTicketList = (_, { id }) => {
    router.push({ name: 'TicketSummary', params: { id } });
};
</script>

<template>
    <FetchData
        url="Warehouses"
        @on-fetch="(data) => (warehousesOptions = data)"
        order="name"
        auto-load
    />

    <FormModelPopup
        :title="t('globals.pageTitles.createTicket')"
        url-create="Tickets/new"
        model="ticket"
        :form-initial-data="initialFormState"
        @on-data-saved="redirectToTicketList"
    >
        <template #form-inputs="{ data }">
            <VnRow>
                <div class="col">
                    <VnSelect
                        :label="t('ticket.create.client')"
                        v-model="data.clientId"
                        url="Clients"
                        :fields="['id', 'name', 'defaultAddressFk']"
                        sort-by="id"
                        option-value="id"
                        option-label="name"
                        hide-selected
                        @update:model-value="(client) => onClientSelected(data)"
                    >
                        <template #option="scope">
                            <QItem v-bind="scope.itemProps">
                                <QItemSection>
                                    <QItemLabel>
                                        {{ scope.opt.name }}
                                    </QItemLabel>
                                    <QItemLabel caption>
                                        {{ `#${scope.opt.id}` }}
                                    </QItemLabel>
                                </QItemSection>
                            </QItem>
                        </template>
                    </VnSelect>
                </div>
            </VnRow>
            <VnRow>
                <div class="col">
                    <VnSelect
                        :label="t('ticket.create.address')"
                        v-model="data.addressId"
                        :options="addressesOptions"
                        option-value="id"
                        option-label="nickname"
                        hide-selected
                        :disable="!data.clientId"
                        @update:model-value="() => fetchAvailableAgencies(data)"
                    >
                        <template #option="scope">
                            <QItem v-bind="scope.itemProps">
                                <QItemSection>
                                    <QItemLabel>
                                        {{ scope.opt.nickname }}
                                    </QItemLabel>
                                    <QItemLabel caption>
                                        {{ `${scope.opt.street}, ${scope.opt.city}` }}
                                    </QItemLabel>
                                </QItemSection>
                            </QItem>
                        </template>
                    </VnSelect>
                </div>
            </VnRow>
            <VnRow>
                <div class="col">
                    <VnInputDate
                        placeholder="dd-mm-aaa"
                        :label="t('ticket.create.landed')"
                        v-model="data.landed"
                        @update:model-value="() => fetchAvailableAgencies(data)"
                    />
                </div>
            </VnRow>
            <VnRow>
                <div class="col">
                    <VnSelect
                        :label="t('ticket.create.warehouse')"
                        v-model="data.warehouseId"
                        :options="warehousesOptions"
                        option-value="id"
                        option-label="name"
                        hide-selected
                        @update:model-value="() => fetchAvailableAgencies(data)"
                    />
                </div>
            </VnRow>
            <VnRow>
                <div class="col">
                    <VnSelect
                        :label="t('ticket.create.agency')"
                        v-model="data.agencyModeId"
                        :options="agenciesOptions"
                        option-value="agencyModeFk"
                        option-label="agencyMode"
                        hide-selected
                        :disable="!data.clientId || !data.landed || !data.warehouseId"
                    />
                </div>
            </VnRow>
        </template>
    </FormModelPopup>
</template>