import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import {
  getMemberOffer,
  getMemberOfferEDMTemplates,
  getMemberOfferAccountTypes,
  getMemberOfferAccountStatuses,
  getMemberOfferClubs,
} from "@/lib/features/member-offers/query";
import { listResorts, getEligibleUnits } from "@/lib/features/resorts/query";
import type { MemberOffer, DropdownOption, EDMTemplateOption } from "@/lib/features/member-offers/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 MemberOfferEditorClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink
      links={[
        { label: "Member Offers", to: "/admin/member-offers" },
        { label: "Editor" },
      ]}
    />
  ),
};

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

    const [resortsRes, edmRes, accountTypesRes, accountStatusesRes, clubsRes] =
      await Promise.all([
        listResorts({ limit: "200" } as any, { Cookie: cookie }),
        getMemberOfferEDMTemplates({ Cookie: cookie }),
        getMemberOfferAccountTypes({ Cookie: cookie }),
        getMemberOfferAccountStatuses({ Cookie: cookie }),
        getMemberOfferClubs({ Cookie: cookie }),
      ]);

    const resorts = resortsRes.success && resortsRes.data ? resortsRes.data.items : [];
    const edmTemplates = edmRes.success && Array.isArray(edmRes.data) ? edmRes.data : [];
    const accountTypes = accountTypesRes.success && Array.isArray(accountTypesRes.data) ? accountTypesRes.data : [];
    const accountStatuses = accountStatusesRes.success && Array.isArray(accountStatusesRes.data) ? accountStatusesRes.data : [];
    const clubs = clubsRes.success && Array.isArray(clubsRes.data) ? clubsRes.data : [];

    if (offerId === "new") {
      return { offer: null, isNew: true, accessScope, resorts, edmTemplates, accountTypes, accountStatuses, clubs };
    }

    const response = await getMemberOffer(offerId, { Cookie: cookie });
    const offer = response.success ? response.data : null;

    let eligibleUnits: any[] = [];
    if (offer?.resort_id && offer?.offer_type) {
      const euRes = await getEligibleUnits(offer.resort_id, offer.offer_type, { Cookie: cookie });
      eligibleUnits = euRes.success && Array.isArray(euRes.data) ? euRes.data : [];
    }

    return {
      offer,
      isNew: false,
      accessScope,
      error: response.success ? undefined : response.message,
      resorts,
      edmTemplates,
      accountTypes,
      accountStatuses,
      clubs,
      eligibleUnits,
    };
  },
);

const MemberOfferEditorPage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const {
    offer, isNew, error, accessScope, resorts,
    edmTemplates, accountTypes, accountStatuses, clubs, eligibleUnits,
  } = loaderData as unknown as {
    offer: MemberOffer | null;
    isNew: boolean;
    accessScope: AccessScope;
    error?: string;
    resorts: { id: string; name: string }[];
    edmTemplates: EDMTemplateOption[];
    accountTypes: DropdownOption[];
    accountStatuses: DropdownOption[];
    clubs: DropdownOption[];
    eligibleUnits: any[];
  };

  return (
    <MemberOfferEditorClientPage
      initialOffer={offer}
      isNew={isNew}
      initialError={error}
      accessScope={accessScope}
      resorts={resorts}
      edmTemplates={edmTemplates}
      accountTypes={accountTypes}
      accountStatuses={accountStatuses}
      clubs={clubs}
      initialEligibleUnits={eligibleUnits ?? []}
    />
  );
};

export default MemberOfferEditorPage;
