"use client";

import { useSearchParams } from "next/navigation";

import { mapCommodityChildModelToFormValues } from "@/app/customer/[tenant]/commodity/_lib/map-commodity-child-model";
import {
  createCommodityChildClient,
  loadCommodityChildFormContextClient,
  loadCommodityChildUpdateFormContextClient,
  updateCommodityChildClient,
} from "@/app/customer/[tenant]/commodity/_lib/commodity-child-api";
import {
  COMMODITY_CHILD_LABELS,
  supportsStandaloneCommodityChildCreate,
  type CommodityChildFormContext,
  type CommodityChildKind,
} from "@/app/customer/[tenant]/commodity/_lib/commodity-child-types";

import { createChildFormRoutePage, childFormComponent } from "./create-child-form-route-page";
import { useCustomerModuleListPath } from "./list-table-form-actions";
import { commodityFormConfig } 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 COMMODITY_CHILD_FORM_ID = "commodity-child-form";

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

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

function shouldUseCommodityChildFormPage(
  child: string | null | undefined,
  pid: string | null | undefined,
  id: string | null | undefined,
): boolean {
  if (!child || !isCommodityChildKind(child)) {
    return false;
  }

  const trimmedPid = pid?.trim() ?? "";
  const trimmedId = id?.trim() ?? "";
  if (trimmedPid || trimmedId) {
    return true;
  }

  return supportsStandaloneCommodityChildCreate(child);
}

const { ChildFormPage: CommodityChildFormPage } = createChildFormRoutePage<
  CommodityChildKind,
  Exclude<CommodityChildKind, "mark_expired">,
  CommodityChildFormContext
>({
  formId: COMMODITY_CHILD_FORM_ID,
  childLabels: COMMODITY_CHILD_LABELS,
  defaultTitle: "Commodity action",
  parentEntityLabel: "commodity",
  isChildKind: isCommodityChildKind,
  isEditableChildKind: isEditableCommodityChildKind,
  supportsStandaloneCreate: supportsStandaloneCommodityChildCreate,
  supportsMarkExpired: true,
  loadCreate: loadCommodityChildFormContextClient,
  loadUpdate: loadCommodityChildUpdateFormContextClient,
  create: createCommodityChildClient,
  update: (child, id, pid, values, formName) =>
    updateCommodityChildClient(child, id, pid, values, formName),
  mapModel: (child, context, pid) =>
    mapCommodityChildModelToFormValues(child, context.model, context.fieldMeta, pid),
  formComponents: {
    sale: childFormComponent(StockSaleChildForm),
    option: childFormComponent(StockOptionTransactionForm),
    accumulator: childFormComponent(StockAccumulatorTransactionForm),
  },
});

export { CommodityChildFormPage };

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

  if (shouldUseCommodityChildFormPage(child, pid, id)) {
    return <CommodityChildFormPage listPath={listPath} />;
  }

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