"use client";

import { useSearchParams } from "next/navigation";

import { mapStockChildModelToFormValues } from "@/app/customer/[tenant]/stock/_lib/map-stock-child-model";
import {
  createStockChildClient,
  loadStockChildFormContextClient,
  loadStockChildUpdateFormContextClient,
  updateStockChildClient,
} from "@/app/customer/[tenant]/stock/_lib/stock-child-api";
import {
  STOCK_CHILD_LABELS,
  supportsStandaloneStockChildCreate,
  type StockChildFormContext,
  type StockChildKind,
} from "@/app/customer/[tenant]/stock/_lib/stock-child-types";

import { createChildFormRoutePage, childFormComponent } from "./create-child-form-route-page";
import { useCustomerModuleListPath } from "./list-table-form-actions";
import { stockFormConfig } from "./module-configs";
import { StockAccumulatorTransactionForm } from "./stock-accumulator-transaction-form";
import { StockOptionTransactionForm } from "./stock-option-transaction-form";
import { StockSaleChildForm } from "./stock-sale-child-form";
import { TransactionModuleFormPage } from "./transaction-module-form-page";

const STOCK_CHILD_FORM_ID = "stock-child-form";

function isStockChildKind(value: string | null): value is StockChildKind {
  return value === "sale" || value === "option" || value === "accumulator" || value === "mark_expired";
}

function isEditableStockChildKind(value: StockChildKind | null): value is Exclude<StockChildKind, "mark_expired"> {
  return value === "sale" || value === "option" || value === "accumulator";
}

const { ChildFormPage: StockChildFormPage } = createChildFormRoutePage<
  StockChildKind,
  Exclude<StockChildKind, "mark_expired">,
  StockChildFormContext
>({
  formId: STOCK_CHILD_FORM_ID,
  childLabels: STOCK_CHILD_LABELS,
  defaultTitle: "Stock action",
  parentEntityLabel: "stock",
  isChildKind: isStockChildKind,
  isEditableChildKind: isEditableStockChildKind,
  supportsStandaloneCreate: supportsStandaloneStockChildCreate,
  supportsMarkExpired: true,
  loadCreate: loadStockChildFormContextClient,
  loadUpdate: (child, id) => loadStockChildUpdateFormContextClient(child, id),
  create: createStockChildClient,
  update: (child, id, _pid, values, formName) => updateStockChildClient(child, id, values, formName),
  mapModel: (child, context, pid) =>
    mapStockChildModelToFormValues(child, context.model, context.fieldMeta, pid),
  formComponents: {
    sale: childFormComponent(StockSaleChildForm),
    option: childFormComponent(StockOptionTransactionForm),
    accumulator: childFormComponent(StockAccumulatorTransactionForm),
  },
});

export { StockChildFormPage };

export function StockFormRoutePage() {
  const searchParams = useSearchParams();
  const child = searchParams.get("child")?.trim();
  const pid = searchParams.get("pid")?.trim();
  const id = searchParams.get("id")?.trim();
  const listPath = useCustomerModuleListPath(stockFormConfig.listPath);

  if (child && (pid || id)) {
    return <StockChildFormPage listPath={listPath} />;
  }

  return <TransactionModuleFormPage config={stockFormConfig} />;
}
