"use client"

import { isApiSuccess } from "@/lib/api-messages";
import { useEffect, useMemo, useState } from "react"
import { useRouter } from "next/navigation"
import { zodResolver } from "@hookform/resolvers/zod"
import { Link2 } from "lucide-react"
import { useForm } from "react-hook-form"
import { toast } from "sonner"

import {
  FormPageHeader,
  FormPanel,
  FormSaveBar,
} from "@/app/dashboard/_components/form"
import { FormField } from "@/components/form/form-field"
import { Input } from "@/components/ui/input"
import { requestDashboardApi } from "@/lib/dashboard-api-client"

import { LIST_HREF } from "../constants"
import type { UnderlyingAliasRow } from "../schema"
import {
  underlyingAliasFormDefaults,
  underlyingAliasFormSchema,
  type UnderlyingAliasFormValues,
} from "./schema"

type Props = {
  mode: "create" | "update"
  initialRow?: UnderlyingAliasRow
}

function rowToValues(row: UnderlyingAliasRow): UnderlyingAliasFormValues {
  return {
    aliasCode: row.aliasCode,
    aliasIsin: row.aliasIsin,
    aliasSource: row.aliasSource,
  }
}

export function UnderlyingAliasForm({ mode, initialRow }: Props) {
  const router = useRouter()
  const isUpdate = mode === "update"
  const [isSaving, setIsSaving] = useState(false)

  const defaultValues = useMemo(
    () => (initialRow ? rowToValues(initialRow) : underlyingAliasFormDefaults),
    [initialRow],
  )

  const form = useForm<UnderlyingAliasFormValues>({
    resolver: zodResolver(underlyingAliasFormSchema),
    defaultValues,
  })

  const {
    register,
    handleSubmit,
    formState: { errors },
  } = form

  useEffect(() => {
    form.reset(initialRow ? rowToValues(initialRow) : underlyingAliasFormDefaults)
  }, [form, initialRow])

  const onSubmit = handleSubmit(async (values) => {
    setIsSaving(true)
    try {
      const url = isUpdate
        ? "/dashboard/master-table/underlying-alias/update"
        : "/dashboard/master-table/underlying-alias/create/submit"

      const body = isUpdate
        ? {
            alias_code: initialRow?.aliasCode,
            alias_isin: values.aliasIsin,
            alias_source: values.aliasSource,
          }
        : values

      const data = await requestDashboardApi<{ status?: string; message?: string }>({
        url,
        method: "POST",
        body,
        fallbackError: `Underlying alias could not be ${isUpdate ? "updated" : "created"}.`,
        validate: (payload) => isApiSuccess(payload),
      })

      toast.success(data.message ?? `Underlying alias ${isUpdate ? "updated" : "created"}.`)
      router.push(LIST_HREF)
      router.refresh()
    } catch (error) {
      toast.error(
        error instanceof Error
          ? error.message
          : `Underlying alias could not be ${isUpdate ? "updated" : "created"}.`,
      )
    } finally {
      setIsSaving(false)
    }
  })

  return (
    <form onSubmit={onSubmit} className="pb-4">
      <FormPageHeader
        backHref={LIST_HREF}
        breadcrumb={[
          { label: "Master Table" },
          { label: "Underlying Alias", href: LIST_HREF },
          { label: isUpdate ? "Update" : "Create" },
        ]}
        titleIcon={<Link2 className="size-5 text-primary" />}
        title={isUpdate ? "Update underlying alias" : "Create underlying alias"}
        description="Map OCR or bank ticker codes to real ISO ISINs used during upload review."
      />

      <FormPanel title="Mapping details">
        <div className="grid gap-4 md:grid-cols-2">
          <FormField
            label="Alias code"
            htmlFor="aliasCode"
            error={errors.aliasCode}
          >
            <Input
              id="aliasCode"
              className="h-9"
              disabled={isUpdate}
              {...register("aliasCode")}
              placeholder="e.g. VST UN EQUITY"
            />
          </FormField>
          <FormField
            label="Real ISIN"
            htmlFor="aliasIsin"
            error={errors.aliasIsin}
          >
            <Input
              id="aliasIsin"
              className="h-9 font-mono"
              {...register("aliasIsin")}
              placeholder="e.g. DE0006231004"
            />
          </FormField>
          <FormField
            label="Alias source"
            htmlFor="aliasSource"
            error={errors.aliasSource}
            className="md:col-span-2"
          >
            <Input
              id="aliasSource"
              className="h-9"
              list="alias-source-suggestions"
              {...register("aliasSource")}
              placeholder="e.g. Bloomberg, BNP"
            />
          </FormField>
        </div>
        {isUpdate && initialRow ? (
          <p className="mt-4 text-xs text-muted-foreground">
            Updated source: {initialRow.updatedSource || "—"} · Last updated: {initialRow.lastUpdated || "—"}
          </p>
        ) : null}
      </FormPanel>

      <FormSaveBar
        cancelHref={LIST_HREF}
        saveLabel={isUpdate ? "Save changes" : "Create"}
        isSaving={isSaving}
      />
    </form>
  )
}
