/*
 * 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 { SDKValidationError } from "../errors/sdkvalidationerror.js";
import { ActionItem, ActionItem$inboundSchema } from "./actionitem.js";
import { CRMMatches, CRMMatches$inboundSchema } from "./crmmatches.js";
import { FathomUser, FathomUser$inboundSchema } from "./fathomuser.js";
import { Invitee, Invitee$inboundSchema } from "./invitee.js";
import {
  MeetingSummary,
  MeetingSummary$inboundSchema,
} from "./meetingsummary.js";
import {
  TranscriptItem,
  TranscriptItem$inboundSchema,
} from "./transcriptitem.js";

export const CalendarInviteesDomainsType = {
  OnlyInternal: "only_internal",
  OneOrMoreExternal: "one_or_more_external",
} as const;
export type CalendarInviteesDomainsType = ClosedEnum<
  typeof CalendarInviteesDomainsType
>;

export type Meeting = {
  title: string;
  /**
   * Calendar event title.
   */
  meetingTitle: string | null;
  /**
   * The ID of the meeting recording.
   */
  recordingId: number;
  url: string;
  shareUrl: string;
  createdAt: Date;
  scheduledStartTime: Date;
  scheduledEndTime: Date;
  recordingStartTime: Date;
  recordingEndTime: Date;
  calendarInviteesDomainsType: CalendarInviteesDomainsType;
  transcriptLanguage: string;
  transcript?: Array<TranscriptItem> | null | undefined;
  defaultSummary?: MeetingSummary | null | undefined;
  actionItems?: Array<ActionItem> | null | undefined;
  calendarInvitees: Array<Invitee>;
  recordedBy: FathomUser;
  /**
   * CRM data linked to the meeting. Only returns data from your or your team's linked CRM.
   *
   * @remarks
   * If no CRM is connected for the workspace, the `error` field will be populated.
   */
  crmMatches?: CRMMatches | null | undefined;
};

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

/** @internal */
export const Meeting$inboundSchema: z.ZodType<Meeting, z.ZodTypeDef, unknown> =
  z.object({
    title: z.string(),
    meeting_title: z.nullable(z.string()),
    recording_id: z.number().int(),
    url: z.string(),
    share_url: z.string(),
    created_at: z.string().datetime({ offset: true }).transform(v =>
      new Date(v)
    ),
    scheduled_start_time: z.string().datetime({ offset: true }).transform(v =>
      new Date(v)
    ),
    scheduled_end_time: z.string().datetime({ offset: true }).transform(v =>
      new Date(v)
    ),
    recording_start_time: z.string().datetime({ offset: true }).transform(v =>
      new Date(v)
    ),
    recording_end_time: z.string().datetime({ offset: true }).transform(v =>
      new Date(v)
    ),
    calendar_invitees_domains_type: CalendarInviteesDomainsType$inboundSchema,
    transcript_language: z.string(),
    transcript: z.nullable(z.array(TranscriptItem$inboundSchema)).optional(),
    default_summary: z.nullable(MeetingSummary$inboundSchema).optional(),
    action_items: z.nullable(z.array(ActionItem$inboundSchema)).optional(),
    calendar_invitees: z.array(Invitee$inboundSchema),
    recorded_by: FathomUser$inboundSchema,
    crm_matches: z.nullable(CRMMatches$inboundSchema).optional(),
  }).transform((v) => {
    return remap$(v, {
      "meeting_title": "meetingTitle",
      "recording_id": "recordingId",
      "share_url": "shareUrl",
      "created_at": "createdAt",
      "scheduled_start_time": "scheduledStartTime",
      "scheduled_end_time": "scheduledEndTime",
      "recording_start_time": "recordingStartTime",
      "recording_end_time": "recordingEndTime",
      "calendar_invitees_domains_type": "calendarInviteesDomainsType",
      "transcript_language": "transcriptLanguage",
      "default_summary": "defaultSummary",
      "action_items": "actionItems",
      "calendar_invitees": "calendarInvitees",
      "recorded_by": "recordedBy",
      "crm_matches": "crmMatches",
    });
  });

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