<template>
    <form @submit.prevent="validate">
        <div class="flex items-center justify-between">
            <h1 class="text-3xl font-bold uppercase">
                {{ customerId ? "Modifications du client" : "Ajout d'un client" }}
            </h1>

            <UiButton
                class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px]"
                type="submit"
                :disabled="isLoading || !auth.isAdmin"
            >
                {{ customerId ? "Sauvegarder" : "Ajouter" }}
            </UiButton>
        </div>

        <div class="grid grid-cols-2 gap-y-8 gap-x-80 mb-10 py-12">
            <UiTextInput id="customer-name" v-model="form.name" label="Nom du client" :disabled="!auth.isAdmin"/>
            <UiTextInput id="customer-phone" v-model="form.phone" label="Téléphone" :disabled="!auth.isAdmin"/>
            <UiTextInput id="customer-email" v-model="form.email" label="Email" :disabled="!auth.isAdmin"/>
        </div>

        <div class="mx-24 mb-4 py-6 border-t border-black"></div>
        <div class="flex items-center justify-between mb-4">
            <h2 class="text-3xl font-bold uppercase">Adresses client</h2>
            <UiButton
                type="button"
                class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px]"
                :disabled="customerId === null || !auth.isAdmin"
                @click="goToAddAddress"
            >
                Ajouter
            </UiButton>
        </div>
        <UiDataTable
            class="mb-10"
            :columns="addressColumns"
            :url="customerId !== null ? `customers/${customerId}` : ''"
            response-path="addresses"
            :items-per-page="5"
            :row-clickable="auth.isAdmin"
            @row-click="onAddressRowClick"
        />
    </form>
</template>

<script setup lang="ts">
import {computed, reactive, ref, watch} from "vue"
import {createCustomer, getCustomer, updateCustomer} from "~/services/customer"
import type {CustomerData, CustomerFormData, CustomerPayload} from "~/services/dto/customer-data"
import type {ColumnConfig, Row} from "~/services/dto/datatable-data"
import {useAuthStore} from "~/stores/auth"

definePageMeta({layout: "default"})

const route = useRoute()
const router = useRouter()
const auth = useAuthStore()

const resolveId = (param: unknown) => {
    const idStr = Array.isArray(param) ? param[0] : param
    if (!idStr) return null
    const id = Number(idStr)
    return Number.isFinite(id) ? id : null
}
const customerId = computed(() => resolveId(route.params.id))
const isLoading = ref(false)
const form = reactive<CustomerFormData>({
    name: "",
    phone: "",
    email: "",
    addresses: [],
})
const addressColumns: ColumnConfig[] = [
    {key: "label", label: "Libellé"},
    {key: "street", label: "Rue"},
    {key: "street2", label: "Complément"},
    {key: "postalCode", label: "Code postal"},
    {key: "city", label: "Ville"},
    {key: "countryCode", label: "Pays"},
]

const goToAddAddress = () => {
    if (customerId.value === null || !auth.isAdmin) return
    router.push({
        path: "/admin/customer/address",
        query: {
            customerId: String(customerId.value),
        },
    })
}

const goToEditAddress = (addressId: number | null) => {
    if (customerId.value === null || addressId === null || !auth.isAdmin) return
    router.push({
        path: "/admin/customer/address",
        query: {
            customerId: String(customerId.value),
            addressId: String(addressId),
        },
    })
}

const onAddressRowClick = (row: Row) => {
    const id = Number(row.id)
    goToEditAddress(Number.isFinite(id) ? id : null)
}

const hydrateFromCustomer = (customer: CustomerData | null) => {
    if (!customer) return
    form.name = customer.name ?? ""
    form.phone = customer.phone ?? ""
    form.email = customer.email ?? ""
}

watch(
    () => customerId.value,
    async (id) => {
        if (id === null) return
        isLoading.value = true
        try {
            const customer = await getCustomer(id)
            hydrateFromCustomer(customer)
        } finally {
            isLoading.value = false
        }
    },
    {immediate: true}
)

async function validate() {
    if (isLoading.value) return
    if (!auth.isAdmin) return
    isLoading.value = true

    try {
        const name = form.name.trim()
        const phone = form.phone?.trim() || null
        const email = form.email?.trim() || null

        const customerPayload: CustomerPayload = {
            name,
            phone,
            email,
        }
        let targetId: number | null = null

        if (customerId.value !== null) {
            await updateCustomer(customerId.value, customerPayload)
            targetId = customerId.value
        } else {
            const created = await createCustomer(customerPayload)
            targetId = created.id
        }

        if (targetId !== null) {
            await router.push(`/admin/customer/${targetId}`)
        }
    } finally {
        isLoading.value = false
    }
}
</script>
