import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import { getResort, getResortUnitTypes } from "@/lib/features/resorts/query";
import type { Resort } from "@/lib/features/resorts/types";
import type { AccessScope, CoreResponse } from "@/lib/features/types";
import { FEATURE_SLUGS, getCheckedAccess, isDevInstance } from "@/lib/role-helpers";
import type { Route } from "./+types/page";
import ResortEditorClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        { label: "Resorts", to: "/admin/resorts" },
        { label: "Editor" },
      ]}
    />
  ),
};

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.resorts,
  "read",
  async ({ request, params }) => {
    const { resortId } = params as { resortId: string };
    const cookie = request.headers.get("Cookie") ?? "";
    const accessScope = getCheckedAccess(request, FEATURE_SLUGS.resorts);
    if (isDevInstance(request)) {
      accessScope.create = false;
      accessScope.update = false;
      accessScope.delete = false;
    }

    const unitTypesRes = await getResortUnitTypes({ Cookie: cookie });
    const unitTypes = unitTypesRes.success && Array.isArray(unitTypesRes.data) ? unitTypesRes.data : [];

    if (resortId === "new") {
      return { resort: null, isNew: true, accessScope, unitTypes };
    }

    const response = await getResort(resortId, { Cookie: cookie });
    return {
      resort: response.success ? response.data : null,
      isNew: false,
      accessScope,
      error: response.success ? undefined : response.message,
      unitTypes,
    };
  },
);

const ResortEditorPage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { resort, isNew, error, accessScope, unitTypes } = loaderData as unknown as {
    resort: Resort | null;
    isNew: boolean;
    accessScope: AccessScope;
    error?: string;
    unitTypes: string[];
  };

  return (
    <ResortEditorClientPage
      initialResort={resort}
      isNew={isNew}
      initialError={error}
      accessScope={accessScope}
      unitTypes={unitTypes}
    />
  );
};

export default ResortEditorPage;
