/*
 * 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 { SDKValidationError } from "./sdkvalidationerror.js";

/**
 * Status code for domain redirect
 */
export const MoveProjectDomainRedirectStatusCode = {
  ThreeHundredAndOne: 301,
  ThreeHundredAndTwo: 302,
  ThreeHundredAndSeven: 307,
  ThreeHundredAndEight: 308,
} as const;
/**
 * Status code for domain redirect
 */
export type MoveProjectDomainRedirectStatusCode = ClosedEnum<
  typeof MoveProjectDomainRedirectStatusCode
>;

export type MoveProjectDomainRequestBody = {
  /**
   * The unique target project identifier
   */
  projectId: string;
  /**
   * Git branch to link the project domain
   */
  gitBranch?: string | null | undefined;
  /**
   * Target destination domain for redirect
   */
  redirect?: string | null | undefined;
  /**
   * Status code for domain redirect
   */
  redirectStatusCode?: MoveProjectDomainRedirectStatusCode | null | undefined;
};

export type MoveProjectDomainRequest = {
  /**
   * The unique project identifier or the project name
   */
  idOrName: string;
  /**
   * The project domain name
   */
  domain: 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?: MoveProjectDomainRequestBody | undefined;
};

/**
 * A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.
 */
export type MoveProjectDomainVerification = {
  type: string;
  domain: string;
  value: string;
  reason: string;
};

/**
 * The domain was updated successfuly
 */
export type MoveProjectDomainResponseBody = {
  name: string;
  apexName: string;
  projectId: string;
  redirect?: string | null | undefined;
  redirectStatusCode?: number | null | undefined;
  gitBranch?: string | null | undefined;
  customEnvironmentId?: string | null | undefined;
  updatedAt?: number | undefined;
  createdAt?: number | undefined;
  /**
   * `true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.
   */
  verified: boolean;
  /**
   * A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.
   */
  verification?: Array<MoveProjectDomainVerification> | undefined;
};

/** @internal */
export const MoveProjectDomainRedirectStatusCode$outboundSchema:
  z.ZodNativeEnum<typeof MoveProjectDomainRedirectStatusCode> = z.nativeEnum(
    MoveProjectDomainRedirectStatusCode,
  );

/** @internal */
export type MoveProjectDomainRequestBody$Outbound = {
  projectId: string;
  gitBranch?: string | null | undefined;
  redirect?: string | null | undefined;
  redirectStatusCode?: number | null | undefined;
};

/** @internal */
export const MoveProjectDomainRequestBody$outboundSchema: z.ZodType<
  MoveProjectDomainRequestBody$Outbound,
  z.ZodTypeDef,
  MoveProjectDomainRequestBody
> = z.object({
  projectId: z.string(),
  gitBranch: z.nullable(z.string()).optional(),
  redirect: z.nullable(z.string()).optional(),
  redirectStatusCode: z.nullable(
    MoveProjectDomainRedirectStatusCode$outboundSchema,
  ).optional(),
});

export function moveProjectDomainRequestBodyToJSON(
  moveProjectDomainRequestBody: MoveProjectDomainRequestBody,
): string {
  return JSON.stringify(
    MoveProjectDomainRequestBody$outboundSchema.parse(
      moveProjectDomainRequestBody,
    ),
  );
}

/** @internal */
export type MoveProjectDomainRequest$Outbound = {
  idOrName: string;
  domain: string;
  teamId?: string | undefined;
  slug?: string | undefined;
  RequestBody?: MoveProjectDomainRequestBody$Outbound | undefined;
};

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

export function moveProjectDomainRequestToJSON(
  moveProjectDomainRequest: MoveProjectDomainRequest,
): string {
  return JSON.stringify(
    MoveProjectDomainRequest$outboundSchema.parse(moveProjectDomainRequest),
  );
}

/** @internal */
export const MoveProjectDomainVerification$inboundSchema: z.ZodType<
  MoveProjectDomainVerification,
  z.ZodTypeDef,
  unknown
> = z.object({
  type: types.string(),
  domain: types.string(),
  value: types.string(),
  reason: types.string(),
});

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

/** @internal */
export const MoveProjectDomainResponseBody$inboundSchema: z.ZodType<
  MoveProjectDomainResponseBody,
  z.ZodTypeDef,
  unknown
> = z.object({
  name: types.string(),
  apexName: types.string(),
  projectId: types.string(),
  redirect: z.nullable(types.string()).optional(),
  redirectStatusCode: z.nullable(types.number()).optional(),
  gitBranch: z.nullable(types.string()).optional(),
  customEnvironmentId: z.nullable(types.string()).optional(),
  updatedAt: types.optional(types.number()),
  createdAt: types.optional(types.number()),
  verified: types.boolean(),
  verification: types.optional(
    z.array(z.lazy(() => MoveProjectDomainVerification$inboundSchema)),
  ),
});

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