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

import * as z from "zod/v3";
import { remap as remap$ } from "../lib/primitives.js";
import { safeParse } from "../lib/schemas.js";
import { ClosedEnum } from "../types/enums.js";
import { Result as SafeParseResult } from "../types/fp.js";
import * as types from "../types/primitives.js";
import { smartUnion } from "../types/smartUnion.js";
import { SDKValidationError } from "./sdkvalidationerror.js";

export type PaidFeatures = {
  concurrentBuilds?: number | null | undefined;
  passwordProtection?: boolean | null | undefined;
  previewDeploymentSuffix?: boolean | null | undefined;
};

export type AcceptedPolicies = {
  eula: Date;
  privacy: Date;
  additionalProperties?: { [k: string]: Date } | undefined;
};

export type AcceptProjectTransferRequestRequestBody = {
  /**
   * The desired name for the project
   */
  newProjectName?: string | undefined;
  paidFeatures?: PaidFeatures | undefined;
  acceptedPolicies?: { [k: string]: AcceptedPolicies } | undefined;
};

export type AcceptProjectTransferRequestRequest = {
  /**
   * The code of the project transfer request.
   */
  code: string;
  /**
   * The Team identifier to perform the request on behalf of.
   */
  teamId?: string | undefined;
  /**
   * The Team slug to perform the request on behalf of.
   */
  slug?: string | undefined;
  requestBody?: AcceptProjectTransferRequestRequestBody | undefined;
};

export type AcceptProjectTransferRequestResponseBody2 = {};

export const AcceptProjectTransferRequestResponseBodyStatus = {
  Errored: "errored",
  Fulfilled: "fulfilled",
} as const;
export type AcceptProjectTransferRequestResponseBodyStatus = ClosedEnum<
  typeof AcceptProjectTransferRequestResponseBodyStatus
>;

export type AcceptProjectTransferRequestResponseBodyError = {};

export type AcceptProjectTransferRequestResponseBodyResult = {
  status: AcceptProjectTransferRequestResponseBodyStatus;
  error?: AcceptProjectTransferRequestResponseBodyError | undefined;
  code?: string | undefined;
};

export type PartnerCalls = {
  installationId: string;
  resourceIds: Array<string>;
  result: AcceptProjectTransferRequestResponseBodyResult;
};

export type ResourceTransferErrors = {};

export type AcceptProjectTransferRequestResponseBody1 = {
  partnerCalls: Array<PartnerCalls>;
  resourceTransferErrors: Array<ResourceTransferErrors>;
  transferredStoreIds: Array<string>;
};

/**
 * The project has been transferred successfully.
 */
export type AcceptProjectTransferRequestResponseBody =
  | AcceptProjectTransferRequestResponseBody1
  | AcceptProjectTransferRequestResponseBody2;

/** @internal */
export type PaidFeatures$Outbound = {
  concurrentBuilds?: number | null | undefined;
  passwordProtection?: boolean | null | undefined;
  previewDeploymentSuffix?: boolean | null | undefined;
};

/** @internal */
export const PaidFeatures$outboundSchema: z.ZodType<
  PaidFeatures$Outbound,
  z.ZodTypeDef,
  PaidFeatures
> = z.object({
  concurrentBuilds: z.nullable(z.number().int()).optional(),
  passwordProtection: z.nullable(z.boolean()).optional(),
  previewDeploymentSuffix: z.nullable(z.boolean()).optional(),
});

export function paidFeaturesToJSON(paidFeatures: PaidFeatures): string {
  return JSON.stringify(PaidFeatures$outboundSchema.parse(paidFeatures));
}

/** @internal */
export type AcceptedPolicies$Outbound = {
  eula: string;
  privacy: string;
  [additionalProperties: string]: unknown;
};

/** @internal */
export const AcceptedPolicies$outboundSchema: z.ZodType<
  AcceptedPolicies$Outbound,
  z.ZodTypeDef,
  AcceptedPolicies
> = z.object({
  eula: z.date().transform(v => v.toISOString()),
  privacy: z.date().transform(v => v.toISOString()),
  additionalProperties: z.record(z.date().transform(v => v.toISOString()))
    .optional(),
}).transform((v) => {
  return {
    ...v.additionalProperties,
    ...remap$(v, {
      additionalProperties: null,
    }),
  };
});

export function acceptedPoliciesToJSON(
  acceptedPolicies: AcceptedPolicies,
): string {
  return JSON.stringify(
    AcceptedPolicies$outboundSchema.parse(acceptedPolicies),
  );
}

/** @internal */
export type AcceptProjectTransferRequestRequestBody$Outbound = {
  newProjectName?: string | undefined;
  paidFeatures?: PaidFeatures$Outbound | undefined;
  acceptedPolicies?: { [k: string]: AcceptedPolicies$Outbound } | undefined;
};

/** @internal */
export const AcceptProjectTransferRequestRequestBody$outboundSchema: z.ZodType<
  AcceptProjectTransferRequestRequestBody$Outbound,
  z.ZodTypeDef,
  AcceptProjectTransferRequestRequestBody
> = z.object({
  newProjectName: z.string().optional(),
  paidFeatures: z.lazy(() => PaidFeatures$outboundSchema).optional(),
  acceptedPolicies: z.record(z.lazy(() => AcceptedPolicies$outboundSchema))
    .optional(),
});

export function acceptProjectTransferRequestRequestBodyToJSON(
  acceptProjectTransferRequestRequestBody:
    AcceptProjectTransferRequestRequestBody,
): string {
  return JSON.stringify(
    AcceptProjectTransferRequestRequestBody$outboundSchema.parse(
      acceptProjectTransferRequestRequestBody,
    ),
  );
}

/** @internal */
export type AcceptProjectTransferRequestRequest$Outbound = {
  code: string;
  teamId?: string | undefined;
  slug?: string | undefined;
  RequestBody?: AcceptProjectTransferRequestRequestBody$Outbound | undefined;
};

/** @internal */
export const AcceptProjectTransferRequestRequest$outboundSchema: z.ZodType<
  AcceptProjectTransferRequestRequest$Outbound,
  z.ZodTypeDef,
  AcceptProjectTransferRequestRequest
> = z.object({
  code: z.string(),
  teamId: z.string().optional(),
  slug: z.string().optional(),
  requestBody: z.lazy(() =>
    AcceptProjectTransferRequestRequestBody$outboundSchema
  ).optional(),
}).transform((v) => {
  return remap$(v, {
    requestBody: "RequestBody",
  });
});

export function acceptProjectTransferRequestRequestToJSON(
  acceptProjectTransferRequestRequest: AcceptProjectTransferRequestRequest,
): string {
  return JSON.stringify(
    AcceptProjectTransferRequestRequest$outboundSchema.parse(
      acceptProjectTransferRequestRequest,
    ),
  );
}

/** @internal */
export const AcceptProjectTransferRequestResponseBody2$inboundSchema: z.ZodType<
  AcceptProjectTransferRequestResponseBody2,
  z.ZodTypeDef,
  unknown
> = z.object({});

export function acceptProjectTransferRequestResponseBody2FromJSON(
  jsonString: string,
): SafeParseResult<
  AcceptProjectTransferRequestResponseBody2,
  SDKValidationError
> {
  return safeParse(
    jsonString,
    (x) =>
      AcceptProjectTransferRequestResponseBody2$inboundSchema.parse(
        JSON.parse(x),
      ),
    `Failed to parse 'AcceptProjectTransferRequestResponseBody2' from JSON`,
  );
}

/** @internal */
export const AcceptProjectTransferRequestResponseBodyStatus$inboundSchema:
  z.ZodNativeEnum<typeof AcceptProjectTransferRequestResponseBodyStatus> = z
    .nativeEnum(AcceptProjectTransferRequestResponseBodyStatus);

/** @internal */
export const AcceptProjectTransferRequestResponseBodyError$inboundSchema:
  z.ZodType<
    AcceptProjectTransferRequestResponseBodyError,
    z.ZodTypeDef,
    unknown
  > = z.object({});

export function acceptProjectTransferRequestResponseBodyErrorFromJSON(
  jsonString: string,
): SafeParseResult<
  AcceptProjectTransferRequestResponseBodyError,
  SDKValidationError
> {
  return safeParse(
    jsonString,
    (x) =>
      AcceptProjectTransferRequestResponseBodyError$inboundSchema.parse(
        JSON.parse(x),
      ),
    `Failed to parse 'AcceptProjectTransferRequestResponseBodyError' from JSON`,
  );
}

/** @internal */
export const AcceptProjectTransferRequestResponseBodyResult$inboundSchema:
  z.ZodType<
    AcceptProjectTransferRequestResponseBodyResult,
    z.ZodTypeDef,
    unknown
  > = z.object({
    status: AcceptProjectTransferRequestResponseBodyStatus$inboundSchema,
    error: types.optional(
      z.lazy(() => AcceptProjectTransferRequestResponseBodyError$inboundSchema),
    ),
    code: types.optional(types.string()),
  });

export function acceptProjectTransferRequestResponseBodyResultFromJSON(
  jsonString: string,
): SafeParseResult<
  AcceptProjectTransferRequestResponseBodyResult,
  SDKValidationError
> {
  return safeParse(
    jsonString,
    (x) =>
      AcceptProjectTransferRequestResponseBodyResult$inboundSchema.parse(
        JSON.parse(x),
      ),
    `Failed to parse 'AcceptProjectTransferRequestResponseBodyResult' from JSON`,
  );
}

/** @internal */
export const PartnerCalls$inboundSchema: z.ZodType<
  PartnerCalls,
  z.ZodTypeDef,
  unknown
> = z.object({
  installationId: types.string(),
  resourceIds: z.array(types.string()),
  result: z.lazy(() =>
    AcceptProjectTransferRequestResponseBodyResult$inboundSchema
  ),
});

export function partnerCallsFromJSON(
  jsonString: string,
): SafeParseResult<PartnerCalls, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => PartnerCalls$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'PartnerCalls' from JSON`,
  );
}

/** @internal */
export const ResourceTransferErrors$inboundSchema: z.ZodType<
  ResourceTransferErrors,
  z.ZodTypeDef,
  unknown
> = z.object({});

export function resourceTransferErrorsFromJSON(
  jsonString: string,
): SafeParseResult<ResourceTransferErrors, SDKValidationError> {
  return safeParse(
    jsonString,
    (x) => ResourceTransferErrors$inboundSchema.parse(JSON.parse(x)),
    `Failed to parse 'ResourceTransferErrors' from JSON`,
  );
}

/** @internal */
export const AcceptProjectTransferRequestResponseBody1$inboundSchema: z.ZodType<
  AcceptProjectTransferRequestResponseBody1,
  z.ZodTypeDef,
  unknown
> = z.object({
  partnerCalls: z.array(z.lazy(() => PartnerCalls$inboundSchema)),
  resourceTransferErrors: z.array(
    z.lazy(() => ResourceTransferErrors$inboundSchema),
  ),
  transferredStoreIds: z.array(types.string()),
});

export function acceptProjectTransferRequestResponseBody1FromJSON(
  jsonString: string,
): SafeParseResult<
  AcceptProjectTransferRequestResponseBody1,
  SDKValidationError
> {
  return safeParse(
    jsonString,
    (x) =>
      AcceptProjectTransferRequestResponseBody1$inboundSchema.parse(
        JSON.parse(x),
      ),
    `Failed to parse 'AcceptProjectTransferRequestResponseBody1' from JSON`,
  );
}

/** @internal */
export const AcceptProjectTransferRequestResponseBody$inboundSchema: z.ZodType<
  AcceptProjectTransferRequestResponseBody,
  z.ZodTypeDef,
  unknown
> = smartUnion([
  z.lazy(() => AcceptProjectTransferRequestResponseBody1$inboundSchema),
  z.lazy(() => AcceptProjectTransferRequestResponseBody2$inboundSchema),
]);

export function acceptProjectTransferRequestResponseBodyFromJSON(
  jsonString: string,
): SafeParseResult<
  AcceptProjectTransferRequestResponseBody,
  SDKValidationError
> {
  return safeParse(
    jsonString,
    (x) =>
      AcceptProjectTransferRequestResponseBody$inboundSchema.parse(
        JSON.parse(x),
      ),
    `Failed to parse 'AcceptProjectTransferRequestResponseBody' from JSON`,
  );
}
