<script setup>
import { onMounted, ref } from 'vue';
import { useRouter } from 'vue-router';
import { useQuasar } from 'quasar';
import { useArrayData } from 'composables/useArrayData';
import VnInput from 'src/components/common/VnInput.vue';

const quasar = useQuasar();

const props = defineProps({
    dataKey: {
        type: String,
        required: true,
    },
    label: {
        type: String,
        required: false,
        default: 'Search',
    },
    info: {
        type: String,
        required: false,
        default: '',
    },
    redirect: {
        type: Boolean,
        required: false,
        default: true,
    },
    url: {
        type: String,
        default: '',
    },
    filter: {
        type: Object,
        default: null,
    },
    where: {
        type: Object,
        default: null,
    },
    order: {
        type: String,
        default: '',
    },
    limit: {
        type: Number,
        default: 10,
    },
    userParams: {
        type: Object,
        default: null,
    },
    staticParams: {
        type: Array,
        default: () => [],
    },
    exprBuilder: {
        type: Function,
        default: null,
    },
    customRouteRedirectName: {
        type: String,
        default: '',
    },
});

const router = useRouter();
const arrayData = useArrayData(props.dataKey, { ...props });
const { store } = arrayData;
const searchText = ref('');

onMounted(() => {
    const params = store.userParams;
    if (params && params.search) {
        searchText.value = params.search;
    }
});

async function search() {
    const staticParams = Object.entries(store.userParams).filter(
        ([key, value]) => value && (props.staticParams || []).includes(key)
    );
    // const filter =props?.where? { where: JSON.parse(props.where) }: {}
    await arrayData.applyFilter({
        params: {
            // filter ,
            ...Object.fromEntries(staticParams),
            search: searchText.value,
        },
    });
    if (!props.redirect) return;

    if (props.customRouteRedirectName)
        return router.push({
            name: props.customRouteRedirectName,
            params: { id: searchText.value },
        });

    const { matched: matches } = router.currentRoute.value;
    const { path } = matches.at(-1);
    const [, moduleName] = path.split('/');

    if (!store.data.length || store.data.length > 1)
        return router.push({ path: `/${moduleName}/list` });

    const targetId = store.data[0].id;
    let targetUrl;

    if (path.endsWith('/list')) targetUrl = path.replace('/list', `/${targetId}/summary`);
    if (path.endsWith('-list')) targetUrl = path.replace('-list', `/${targetId}/summary`);
    else if (path.includes(':id')) targetUrl = path.replace(':id', targetId);

    await router.push({ path: targetUrl });
}
</script>

<template>
    <QForm @submit="search" id="searchbarForm">
        <VnInput
            id="searchbar"
            v-model="searchText"
            :placeholder="props.label"
            dense
            standout
            autofocus
        >
            <template #prepend>
                <QIcon
                    v-if="!quasar.platform.is.mobile"
                    class="cursor-pointer"
                    name="search"
                    @click="search"
                />
            </template>
            <template #append>
                <QIcon
                    v-if="props.info && $q.screen.gt.xs"
                    name="info"
                    class="cursor-info"
                >
                    <QTooltip>{{ props.info }}</QTooltip>
                </QIcon>
            </template>
        </VnInput>
    </QForm>
</template>

<style lang="scss" scoped>
@media screen and (min-width: $breakpoint-sm-max) {
    .q-field {
        width: 450px;
    }
}

.q-field {
    transition: width 0.36s;
}
</style>

<style lang="scss">
.cursor-info {
    cursor: help;
}
#searchbar {
    .q-field--standout.q-field--highlighted .q-field__control {
        background-color: white;
        color: black;
        .q-field__native,
        .q-icon {
            color: black !important;
        }
    }
}
</style>
