/*
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

import { PolarCore } from "../core.js";
import {
  WebhookBenefitCreatedPayload,
  webhookBenefitCreatedPayloadFromJSON,
} from "../models/components/webhookbenefitcreatedpayload.js";
import {
  WebhookBenefitGrantCreatedPayload,
  webhookBenefitGrantCreatedPayloadFromJSON,
} from "../models/components/webhookbenefitgrantcreatedpayload.js";
import {
  WebhookBenefitGrantCycledPayload,
  webhookBenefitGrantCycledPayloadFromJSON,
} from "../models/components/webhookbenefitgrantcycledpayload.js";
import {
  WebhookBenefitGrantRevokedPayload,
  webhookBenefitGrantRevokedPayloadFromJSON,
} from "../models/components/webhookbenefitgrantrevokedpayload.js";
import {
  WebhookBenefitGrantUpdatedPayload,
  webhookBenefitGrantUpdatedPayloadFromJSON,
} from "../models/components/webhookbenefitgrantupdatedpayload.js";
import {
  WebhookBenefitUpdatedPayload,
  webhookBenefitUpdatedPayloadFromJSON,
} from "../models/components/webhookbenefitupdatedpayload.js";
import {
  WebhookCheckoutCreatedPayload,
  webhookCheckoutCreatedPayloadFromJSON,
} from "../models/components/webhookcheckoutcreatedpayload.js";
import {
  WebhookCheckoutExpiredPayload,
  webhookCheckoutExpiredPayloadFromJSON,
} from "../models/components/webhookcheckoutexpiredpayload.js";
import {
  WebhookCheckoutUpdatedPayload,
  webhookCheckoutUpdatedPayloadFromJSON,
} from "../models/components/webhookcheckoutupdatedpayload.js";
import {
  WebhookCustomerCreatedPayload,
  webhookCustomerCreatedPayloadFromJSON,
} from "../models/components/webhookcustomercreatedpayload.js";
import {
  WebhookCustomerDeletedPayload,
  webhookCustomerDeletedPayloadFromJSON,
} from "../models/components/webhookcustomerdeletedpayload.js";
import {
  WebhookCustomerSeatAssignedPayload,
  webhookCustomerSeatAssignedPayloadFromJSON,
} from "../models/components/webhookcustomerseatassignedpayload.js";
import {
  WebhookCustomerSeatClaimedPayload,
  webhookCustomerSeatClaimedPayloadFromJSON,
} from "../models/components/webhookcustomerseatclaimedpayload.js";
import {
  WebhookCustomerSeatRevokedPayload,
  webhookCustomerSeatRevokedPayloadFromJSON,
} from "../models/components/webhookcustomerseatrevokedpayload.js";
import {
  WebhookCustomerStateChangedPayload,
  webhookCustomerStateChangedPayloadFromJSON,
} from "../models/components/webhookcustomerstatechangedpayload.js";
import {
  WebhookCustomerUpdatedPayload,
  webhookCustomerUpdatedPayloadFromJSON,
} from "../models/components/webhookcustomerupdatedpayload.js";
import {
  WebhookMemberCreatedPayload,
  webhookMemberCreatedPayloadFromJSON,
} from "../models/components/webhookmembercreatedpayload.js";
import {
  WebhookMemberDeletedPayload,
  webhookMemberDeletedPayloadFromJSON,
} from "../models/components/webhookmemberdeletedpayload.js";
import {
  WebhookMemberUpdatedPayload,
  webhookMemberUpdatedPayloadFromJSON,
} from "../models/components/webhookmemberupdatedpayload.js";
import {
  WebhookOrderCreatedPayload,
  webhookOrderCreatedPayloadFromJSON,
} from "../models/components/webhookordercreatedpayload.js";
import {
  WebhookOrderPaidPayload,
  webhookOrderPaidPayloadFromJSON,
} from "../models/components/webhookorderpaidpayload.js";
import {
  WebhookOrderRefundedPayload,
  webhookOrderRefundedPayloadFromJSON,
} from "../models/components/webhookorderrefundedpayload.js";
import {
  WebhookOrderUpdatedPayload,
  webhookOrderUpdatedPayloadFromJSON,
} from "../models/components/webhookorderupdatedpayload.js";
import {
  WebhookOrganizationUpdatedPayload,
  webhookOrganizationUpdatedPayloadFromJSON,
} from "../models/components/webhookorganizationupdatedpayload.js";
import {
  WebhookProductCreatedPayload,
  webhookProductCreatedPayloadFromJSON,
} from "../models/components/webhookproductcreatedpayload.js";
import {
  WebhookProductUpdatedPayload,
  webhookProductUpdatedPayloadFromJSON,
} from "../models/components/webhookproductupdatedpayload.js";
import {
  WebhookRefundCreatedPayload,
  webhookRefundCreatedPayloadFromJSON,
} from "../models/components/webhookrefundcreatedpayload.js";
import {
  WebhookRefundUpdatedPayload,
  webhookRefundUpdatedPayloadFromJSON,
} from "../models/components/webhookrefundupdatedpayload.js";
import {
  WebhookSubscriptionActivePayload,
  webhookSubscriptionActivePayloadFromJSON,
} from "../models/components/webhooksubscriptionactivepayload.js";
import {
  WebhookSubscriptionCanceledPayload,
  webhookSubscriptionCanceledPayloadFromJSON,
} from "../models/components/webhooksubscriptioncanceledpayload.js";
import {
  WebhookSubscriptionCreatedPayload,
  webhookSubscriptionCreatedPayloadFromJSON,
} from "../models/components/webhooksubscriptioncreatedpayload.js";
import {
  WebhookSubscriptionPastDuePayload,
  webhookSubscriptionPastDuePayloadFromJSON,
} from "../models/components/webhooksubscriptionpastduepayload.js";
import {
  WebhookSubscriptionPausedPayload,
  webhookSubscriptionPausedPayloadFromJSON,
} from "../models/components/webhooksubscriptionpausedpayload.js";
import {
  WebhookSubscriptionResumedPayload,
  webhookSubscriptionResumedPayloadFromJSON,
} from "../models/components/webhooksubscriptionresumedpayload.js";
import {
  WebhookSubscriptionRevokedPayload,
  webhookSubscriptionRevokedPayloadFromJSON,
} from "../models/components/webhooksubscriptionrevokedpayload.js";
import {
  WebhookSubscriptionUncanceledPayload,
  webhookSubscriptionUncanceledPayloadFromJSON,
} from "../models/components/webhooksubscriptionuncanceledpayload.js";
import {
  WebhookSubscriptionUpdatedPayload,
  webhookSubscriptionUpdatedPayloadFromJSON,
} from "../models/components/webhooksubscriptionupdatedpayload.js";
import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
import { ERR, Result } from "../types/fp.js";

export async function validateWebhook(_client: PolarCore, {
  request: rawRequest,
}: {
  request: {
    body: BodyInit;
    method: string;
    url: string;
    headers: Record<string, string> | Headers;
  } | Request;
}): Promise<
  Result<
    | WebhookCheckoutCreatedPayload
    | WebhookCheckoutUpdatedPayload
    | WebhookCheckoutExpiredPayload
    | WebhookCustomerCreatedPayload
    | WebhookCustomerUpdatedPayload
    | WebhookCustomerDeletedPayload
    | WebhookCustomerStateChangedPayload
    | WebhookCustomerSeatAssignedPayload
    | WebhookCustomerSeatClaimedPayload
    | WebhookCustomerSeatRevokedPayload
    | WebhookMemberCreatedPayload
    | WebhookMemberUpdatedPayload
    | WebhookMemberDeletedPayload
    | WebhookOrderCreatedPayload
    | WebhookOrderUpdatedPayload
    | WebhookOrderPaidPayload
    | WebhookOrderRefundedPayload
    | WebhookSubscriptionCreatedPayload
    | WebhookSubscriptionUpdatedPayload
    | WebhookSubscriptionActivePayload
    | WebhookSubscriptionCanceledPayload
    | WebhookSubscriptionUncanceledPayload
    | WebhookSubscriptionRevokedPayload
    | WebhookSubscriptionPastDuePayload
    | WebhookSubscriptionPausedPayload
    | WebhookSubscriptionResumedPayload
    | WebhookRefundCreatedPayload
    | WebhookRefundUpdatedPayload
    | WebhookProductCreatedPayload
    | WebhookProductUpdatedPayload
    | WebhookOrganizationUpdatedPayload
    | WebhookBenefitCreatedPayload
    | WebhookBenefitUpdatedPayload
    | WebhookBenefitGrantCreatedPayload
    | WebhookBenefitGrantUpdatedPayload
    | WebhookBenefitGrantCycledPayload
    | WebhookBenefitGrantRevokedPayload,
    SDKValidationError
  >
> {
  const request = normalizeRequest(rawRequest);
  const jsonString = await request.text();
  const knownSchemas = [
    webhookCheckoutCreatedPayloadFromJSON,
    webhookCheckoutUpdatedPayloadFromJSON,
    webhookCheckoutExpiredPayloadFromJSON,
    webhookCustomerCreatedPayloadFromJSON,
    webhookCustomerUpdatedPayloadFromJSON,
    webhookCustomerDeletedPayloadFromJSON,
    webhookCustomerStateChangedPayloadFromJSON,
    webhookCustomerSeatAssignedPayloadFromJSON,
    webhookCustomerSeatClaimedPayloadFromJSON,
    webhookCustomerSeatRevokedPayloadFromJSON,
    webhookMemberCreatedPayloadFromJSON,
    webhookMemberUpdatedPayloadFromJSON,
    webhookMemberDeletedPayloadFromJSON,
    webhookOrderCreatedPayloadFromJSON,
    webhookOrderUpdatedPayloadFromJSON,
    webhookOrderPaidPayloadFromJSON,
    webhookOrderRefundedPayloadFromJSON,
    webhookSubscriptionCreatedPayloadFromJSON,
    webhookSubscriptionUpdatedPayloadFromJSON,
    webhookSubscriptionActivePayloadFromJSON,
    webhookSubscriptionCanceledPayloadFromJSON,
    webhookSubscriptionUncanceledPayloadFromJSON,
    webhookSubscriptionRevokedPayloadFromJSON,
    webhookSubscriptionPastDuePayloadFromJSON,
    webhookSubscriptionPausedPayloadFromJSON,
    webhookSubscriptionResumedPayloadFromJSON,
    webhookRefundCreatedPayloadFromJSON,
    webhookRefundUpdatedPayloadFromJSON,
    webhookProductCreatedPayloadFromJSON,
    webhookProductUpdatedPayloadFromJSON,
    webhookOrganizationUpdatedPayloadFromJSON,
    webhookBenefitCreatedPayloadFromJSON,
    webhookBenefitUpdatedPayloadFromJSON,
    webhookBenefitGrantCreatedPayloadFromJSON,
    webhookBenefitGrantUpdatedPayloadFromJSON,
    webhookBenefitGrantCycledPayloadFromJSON,
    webhookBenefitGrantRevokedPayloadFromJSON,
  ];

  for (const schema of knownSchemas) {
    const ret = schema(jsonString);
    if (ret.ok) {
      return ret;
    }
  }

  return ERR(
    new SDKValidationError(
      "No matching schema found for the given webhook payload",
      jsonString,
      jsonString,
    ),
  );
}

function normalizeRequest(
  request: {
    body: BodyInit;
    method: string;
    url: string;
    headers: Record<string, string> | Headers;
  } | Request,
): Request {
  if (request instanceof Request) {
    return request;
  }
  return new Request(request.url, request);
}
