import short from "short-uuid";
import { v5 } from "uuid";
import { a as appStore } from "./index-m1t7Z5Lc.js";
import { g as getDailyAppKeys } from "./getDailyAppKeys-IV58XVZU.js";
import { a3 as getUid, E as sendBrokenIntegrationEmail, R as DailyLocationType } from "./email-manager-ED8hrFPG.js";
import { l as logger, p as prisma } from "./index-Cw1zbw54.js";
import { g as getPiiFreeCredential, a as getPiiFreeCalendarEvent } from "./piiFreeData-dxrPDUBm.js";
import { a as safeStringify } from "./index-browser-c8sQ7p7S.js";
const log = logger.getSubLogger({ prefix: ["[lib] videoClient"] });
const translator = short();
const getVideoAdapters = async (withCredentials) => {
  const videoAdapters = [];
  for (const cred of withCredentials) {
    const appName = cred.type.split("_").join("");
    log.silly("Getting video adapter for", safeStringify({ appName, cred: getPiiFreeCredential(cred) }));
    const appImportFn = appStore[appName];
    const app = appImportFn ? await appImportFn() : null;
    if (!app) {
      log.error(`Couldn't get adapter for ${appName}`);
      continue;
    }
    if ("lib" in app && "VideoApiAdapter" in app.lib) {
      const makeVideoApiAdapter = app.lib.VideoApiAdapter;
      const videoAdapter = makeVideoApiAdapter(cred);
      videoAdapters.push(videoAdapter);
    } else {
      log.error(`App ${appName} doesn't have 'lib.VideoApiAdapter' defined`);
    }
  }
  return videoAdapters;
};
const createMeeting = async (credential, calEvent) => {
  const uid = getUid(calEvent);
  log.debug(
    "createMeeting",
    safeStringify({
      credential: getPiiFreeCredential(credential),
      uid,
      calEvent: getPiiFreeCalendarEvent(calEvent)
    })
  );
  if (!credential || !credential.appId) {
    throw new Error(
      "Credentials must be set! Video platforms are optional, so this method shouldn't even be called when no video credentials are set."
    );
  }
  const videoAdapters = await getVideoAdapters([credential]);
  const [firstVideoAdapter] = videoAdapters;
  let createdMeeting;
  let returnObject = {
    appName: credential.appId || "",
    type: credential.type,
    uid,
    originalEvent: calEvent,
    success: false,
    createdEvent: void 0,
    credentialId: credential.id
  };
  try {
    const enabledApp = await prisma.app.findUnique({
      where: {
        slug: credential.appId
      },
      select: {
        enabled: true
      }
    });
    if (!enabledApp?.enabled)
      throw `Location app ${credential.appId} is either disabled or not seeded at all`;
    createdMeeting = await firstVideoAdapter?.createMeeting(calEvent);
    returnObject = { ...returnObject, createdEvent: createdMeeting, success: true };
    log.debug("created Meeting", safeStringify(returnObject));
  } catch (err) {
    await sendBrokenIntegrationEmail(calEvent, "video");
    log.error(
      "createMeeting failed",
      safeStringify(err),
      safeStringify({ calEvent: getPiiFreeCalendarEvent(calEvent) })
    );
    const defaultMeeting = await createMeetingWithCalVideo(calEvent);
    if (defaultMeeting) {
      calEvent.location = DailyLocationType;
    }
    returnObject = { ...returnObject, originalEvent: calEvent, createdEvent: defaultMeeting };
  }
  return returnObject;
};
const updateMeeting = async (credential, calEvent, bookingRef) => {
  const uid = translator.fromUUID(v5(JSON.stringify(calEvent), v5.URL));
  let success = true;
  const [firstVideoAdapter] = await getVideoAdapters([credential]);
  const canCallUpdateMeeting = !!(credential && bookingRef);
  const updatedMeeting = canCallUpdateMeeting ? await firstVideoAdapter?.updateMeeting(bookingRef, calEvent).catch(async (e) => {
    await sendBrokenIntegrationEmail(calEvent, "video");
    log.error("updateMeeting failed", e, calEvent);
    success = false;
    return void 0;
  }) : void 0;
  if (!updatedMeeting) {
    log.error(
      "updateMeeting failed",
      safeStringify({ bookingRef, canCallUpdateMeeting, calEvent, credential })
    );
    return {
      appName: credential.appId || "",
      type: credential.type,
      success,
      uid,
      originalEvent: calEvent
    };
  }
  return {
    appName: credential.appId || "",
    type: credential.type,
    success,
    uid,
    updatedEvent: updatedMeeting,
    originalEvent: calEvent
  };
};
const deleteMeeting = async (credential, uid) => {
  if (credential) {
    const videoAdapter = (await getVideoAdapters([credential]))[0];
    log.debug(
      "Calling deleteMeeting for",
      safeStringify({ credential: getPiiFreeCredential(credential), uid })
    );
    if (videoAdapter) {
      return videoAdapter.deleteMeeting(uid);
    }
  }
  return Promise.resolve({});
};
const createMeetingWithCalVideo = async (calEvent) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.createMeeting(calEvent);
};
const createInstantMeetingWithCalVideo = async (endTime) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.createInstantCalVideoRoom?.(endTime);
};
const getRecordingsOfCalVideoByRoomName = async (roomName) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    console.error("Error: Cal video provider is not installed.");
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.getRecordings?.(roomName);
};
const getDownloadLinkOfCalVideoByRecordingId = async (recordingId) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    console.error("Error: Cal video provider is not installed.");
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.getRecordingDownloadLink?.(recordingId);
};
const getAllTranscriptsAccessLinkFromRoomName = async (roomName) => {
  let dailyAppKeys;
  try {
    dailyAppKeys = await getDailyAppKeys();
  } catch (e) {
    console.error("Error: Cal video provider is not installed.");
    return;
  }
  const [videoAdapter] = await getVideoAdapters([
    {
      id: 0,
      appId: "daily-video",
      type: "daily_video",
      userId: null,
      user: { email: "" },
      teamId: null,
      key: dailyAppKeys,
      invalid: false,
      delegationCredentialId: null
    }
  ]);
  return videoAdapter?.getAllTranscriptsAccessLinkFromRoomName?.(roomName);
};
export {
  getDownloadLinkOfCalVideoByRecordingId as a,
  getAllTranscriptsAccessLinkFromRoomName as b,
  createMeeting as c,
  deleteMeeting as d,
  createInstantMeetingWithCalVideo as e,
  getRecordingsOfCalVideoByRoomName as g,
  updateMeeting as u
};
