import type { Api } from "@jellyfin/sdk";
import type { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models";
import type { ImageSource } from "expo-image";

interface Props {
  item: BaseItemDto;
  api: Api;
  quality?: number;
  width?: number;
  variant?:
    | "Primary"
    | "Backdrop"
    | "ParentBackdrop"
    | "ParentLogo"
    | "Logo"
    | "AlbumPrimary"
    | "SeriesPrimary"
    | "Screenshot"
    | "Thumb";
}

export const getItemImage = ({
  item,
  api,
  variant = "Primary",
  quality = 90,
  width = 1000,
}: Props) => {
  if (!api) return null;

  let tag: string | null | undefined;
  let blurhash: string | null | undefined;
  let src: ImageSource | null = null;

  switch (variant) {
    case "Backdrop":
      if (item.Type === "Episode") {
        tag = item.ParentBackdropImageTags?.[0];
        if (!tag) break;
        blurhash = item.ImageBlurHashes?.Backdrop?.[tag];
        src = {
          uri: `${api.basePath}/Items/${item.ParentBackdropItemId}/Images/Backdrop/0?quality=${quality}&tag=${tag}&width=${width}`,
          blurhash,
        };
        break;
      }

      tag = item.BackdropImageTags?.[0];
      if (!tag) break;
      blurhash = item.ImageBlurHashes?.Backdrop?.[tag];
      src = {
        uri: `${api.basePath}/Items/${item.Id}/Images/Backdrop/0?quality=${quality}&tag=${tag}&width=${width}`,
        blurhash,
      };
      break;
    case "Primary":
      tag = item.ImageTags?.Primary;
      if (!tag) break;
      blurhash = item.ImageBlurHashes?.Primary?.[tag];

      src = {
        uri: `${api.basePath}/Items/${item.Id}/Images/Primary?quality=${quality}&tag=${tag}&width=${width}`,
        blurhash,
      };
      break;
    case "Thumb":
      tag = item.ImageTags?.Thumb;
      if (!tag) break;
      blurhash = item.ImageBlurHashes?.Thumb?.[tag];

      src = {
        uri: `${api.basePath}/Items/${item.Id}/Images/Backdrop?quality=${quality}&tag=${tag}&width=${width}`,
        blurhash,
      };
      break;
    default:
      tag = item.ImageTags?.Primary;
      src = {
        uri: `${api.basePath}/Items/${item.Id}/Images/Primary?quality=${quality}&tag=${tag}&width=${width}`,
      };
      break;
  }

  if (!src?.uri) return null;

  return src;
};
