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

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

        <div class="grid grid-cols-2 gap-y-16 gap-x-12 mb-10 py-12  border-b border-black ">
            <UiTextInput id="supplier-name" v-model="form.name" label="Nom du fournisseur" :disabled="!auth.isAdmin"/>
            <UiTextInput id="supplier-email" v-model="form.email" label="Email" :disabled="!auth.isAdmin"/>
            <UiTextInput id="supplier-phone" v-model="form.phone" label="Téléphone" :disabled="!auth.isAdmin"/>
        </div>

        <div class="flex items-center justify-between 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 fournisseur</h2>
            <button
                type="button"
                class="text-xl uppercase bg-primary-500 text-white h-[50px] w-[272px]"
                :disabled="supplierId === null || !auth.isAdmin"
                @click="goToAddAddress"
            >
                Ajouter
            </button>
        </div>
        <div class="overflow-x-auto mb-10">
            <table class="w-full border-collapse">
                <thead>
                <tr class="text-left border-b border-gray-200">
                    <th class="py-3 pr-4 text-sm uppercase">Libellé</th>
                    <th class="py-3 pr-4 text-sm uppercase">Rue</th>
                    <th class="py-3 pr-4 text-sm uppercase">Complément</th>
                    <th class="py-3 pr-4 text-sm uppercase">Code postal</th>
                    <th class="py-3 pr-4 text-sm uppercase">Ville</th>
                    <th class="py-3 pr-4 text-sm uppercase">Pays</th>
                </tr>
                </thead>
                <tbody>
                <template v-if="form.addresses.length === 0">
                    <tr>
                        <td colspan="6" class="py-4 text-slate-400">
                            Aucune adresse.
                        </td>
                    </tr>
                </template>
                <template v-else>
                    <tr
                        v-for="(address, index) in form.addresses"
                        :key="address.id ?? index"
                        class="border-b border-gray-100 hover:bg-slate-50"
                        :class="auth.isAdmin ? 'cursor-pointer' : 'cursor-not-allowed opacity-60'"
                        @click="goToEditAddress(address.id ?? null)"
                    >
                        <td class="py-3 pr-4">{{ address.label || "—" }}</td>
                        <td class="py-3 pr-4">{{ address.street || "—" }}</td>
                        <td class="py-3 pr-4">{{ address.street2 || "—" }}</td>
                        <td class="py-3 pr-4">{{ address.postalCode || "—" }}</td>
                        <td class="py-3 pr-4">{{ address.city || "—" }}</td>
                        <td class="py-3 pr-4">{{ address.countryCode || "—" }}</td>
                    </tr>
                </template>
                </tbody>
            </table>
        </div>
    </form>
</template>

<script setup lang="ts">
import {computed, reactive, ref, watch} from "vue"
import {createSupplier, getSupplier, updateSupplier} from "~/services/supplier"
import type {SupplierData, SupplierFormData, SupplierPayload} from "~/services/dto/supplier-data"
import {useAuthStore} from "~/stores/auth"

definePageMeta({layout: "admin"})

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 supplierId = computed(() => resolveId(route.params.id))
const isLoading = ref(false)
const form = reactive<SupplierFormData>({
    name: "",
    email: "",
    phone: "",
    addresses: [],
})

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

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

const hydrateFromSupplier = (supplier: SupplierData | null) => {
    if (!supplier) return
    if (!Array.isArray(supplier.addresses) || supplier.addresses.length === 0) {
        form.addresses = []
        return
    }
    if (typeof supplier.addresses[0] === "string") {
        form.addresses = []
        return
    }

    form.addresses = supplier.addresses.map((address) => ({
        id: address.id ?? null,
        label: address.label ?? "",
        street: address.street ?? "",
        street2: address.street2 ?? null,
        postalCode: address.postalCode ?? "",
        city: address.city ?? "",
        countryCode: address.countryCode ?? "",
    }))
}

watch(
    () => supplierId.value,
    async (id) => {
        if (id === null) return
        isLoading.value = true
        try {
            const supplier = await getSupplier(id)
            hydrateFromSupplier(supplier)
        } 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 email = (form.email ?? "").trim() || null
        const phone = (form.phone ?? "").trim() || null

        const supplierPayload: SupplierPayload = {
            name,
            email,
            phone,
        }

        if (supplierId.value !== null) {
            await updateSupplier(supplierId.value, supplierPayload)
        } else {
            await createSupplier(supplierPayload)
        }

        await router.push("/admin/supplier/supplier-list")
    } finally {
        isLoading.value = false
    }
}
</script>
