import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import { listMemberOffers } from "@/lib/features/member-offers/query";
import { listResorts } from "@/lib/features/resorts/query";
import type { MemberOfferListResponse } 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 MemberOffersListClientPage from "./_client";

export const handle = {
  breadcrumb: () => (
    <BreadCrumbLink links={[{ label: "Member Offers" }, { label: "Overview" }]} />
  ),
};

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.memberOffers,
  "read",
  async ({ request }) => {
    const url = new URL(request.url);
    const page = parseInt(url.searchParams.get("page") ?? "1", 10);
    const limit = parseInt(url.searchParams.get("pageSize") ?? "20", 10);
    const search = url.searchParams.get("search") ?? undefined;
    const offer_type = url.searchParams.get("offer_type") ?? undefined;
    const resort_id = url.searchParams.get("resort_id") ?? undefined;
    const publish_mode = url.searchParams.get("publish_mode") ?? undefined;

    const cookie = request.headers.get("Cookie") ?? "";
    const [offersRes, resortsRes, publishedRes, draftRes, scheduledRes, archivedRes] = await Promise.all([
      listMemberOffers(
        { page, limit, search, offer_type, resort_id, publish_mode },
        { Cookie: cookie }
      ),
      listResorts({ limit: "200" } as any, { Cookie: cookie }),
      listMemberOffers({ publish_mode: "PUBLISHED", limit: 1 }, { Cookie: cookie }),
      listMemberOffers({ publish_mode: "DRAFT", limit: 1 }, { Cookie: cookie }),
      listMemberOffers({ publish_mode: "SCHEDULED", limit: 1 }, { Cookie: cookie }),
      listMemberOffers({ publish_mode: "ARCHIVED", limit: 1 }, { Cookie: cookie }),
    ]);
    const accessScope = getCheckedAccess(request, FEATURE_SLUGS.memberOffers);
    if (isDevInstance(request)) {
      accessScope.create = false;
      accessScope.update = false;
      accessScope.delete = false;
    }
    const resorts = resortsRes.success && resortsRes.data ? resortsRes.data.items : [];
    return {
      response: offersRes,
      accessScope,
      resorts,
      metrics: {
        published: publishedRes.success && publishedRes.data ? publishedRes.data.total : 0,
        draft: draftRes.success && draftRes.data ? draftRes.data.total : 0,
        scheduled: scheduledRes.success && scheduledRes.data ? scheduledRes.data.total : 0,
        archived: archivedRes.success && archivedRes.data ? archivedRes.data.total : 0,
      },
    };
  },
);

const MemberOffersListPage: React.FC<Route.ComponentProps> = ({ loaderData }) => {
  const { response, accessScope, resorts, metrics } = loaderData as unknown as {
    response: CoreResponse<MemberOfferListResponse>;
    accessScope: AccessScope;
    resorts: { id: string; name: string }[];
    metrics: { published: number; draft: number; scheduled: number; archived: number };
  };

  return (
    <MemberOffersListClientPage
      initialData={response?.success ? response.data : { items: [], total: 0, page: 1, limit: 20 }}
      initialError={response?.success ? undefined : response?.message}
      accessScope={accessScope}
      resorts={resorts}
      systemMetrics={metrics}
    />
  );
};

export default MemberOffersListPage;
