import { unwrapArray } from "@/helpers/array";
import type {
  ExternalVideoField,
  MediaSourceRecord,
  VideoOption,
} from "@/types";

export const DEFAULT_VIDEO_OPTIONS: VideoOption[] = [
  "autoplay",
  "controls",
  "loop",
  "mute",
];

export const getMediaType = (mediaSource?: MediaSourceRecord) => {
  const media = unwrapArray(mediaSource);

  if (!media) return null;
  if (media.externalVideo) return "extVideo";
  if (media.asset?.responsiveImage || media.asset?.format == "svg")
    return "image";
  if (media.asset?.video) return "fileVideo";

  return null;
};

export const buildVimeoEmbedSrc = (id: string, options: VideoOption[] = []) => {
  const base = `https://player.vimeo.com/video/${id}?`;
  const params = new URLSearchParams();

  DEFAULT_VIDEO_OPTIONS.forEach((option: VideoOption) => {
    const value = options.includes(option) ? "1" : "0";

    if (option === "autoplay" && value === "1") {
      params.append("autoplay", "1");
      params.append("autopause", "0");
    }
    if (option === "mute") params.append("muted", value);

    params.append(option, value);
  });

  return base + params.toString();
};

export const buildYoutubeEmbedSrc = (
  id: string,
  options: VideoOption[] = [],
) => {
  const base = `https://www.youtube.com/embed/${id}?`;
  const params = new URLSearchParams();

  DEFAULT_VIDEO_OPTIONS.forEach((option: VideoOption) => {
    const value = options.includes(option) ? "1" : "0";

    if (option === "loop" && value === "1") params.append("playlist", id);

    params.append(option, value);
  });

  return base + params.toString();
};

export const buildExternalVideoSrc = (
  video: ExternalVideoField,
  options: VideoOption[] = [],
) => {
  let src = "";
  if (video.provider === "vimeo") {
    src = buildVimeoEmbedSrc(video.providerUid, options);
  } else if (video.provider === "youtube") {
    src = buildYoutubeEmbedSrc(video.providerUid, options);
  }
  return src;
};
