defmodule Pinchflat.MediaFixtures do
  @moduledoc """
  This module defines test helpers for creating
  entities via the `Pinchflat.Media` context.
  """

  alias Pinchflat.MediaSourceFixtures

  @doc """
  Generate a media_item.
  """
  def media_item_fixture(attrs \\ %{}) do
    {:ok, media_item} =
      attrs
      |> Enum.into(%{
        media_id: Faker.String.base64(12),
        title: Faker.Commerce.product_name(),
        original_url: "https://www.youtube.com/channel/#{Faker.String.base64(12)}",
        livestream: false,
        media_filepath: "/video/#{Faker.File.file_name(:video)}",
        source_id: MediaSourceFixtures.source_fixture().id
      })
      |> Pinchflat.Media.create_media_item()

    media_item
  end

  @doc """
  Generate a media_item with metadata.
  """
  def media_item_with_metadata(attrs \\ %{}) do
    json_filepath =
      Path.join([
        File.cwd!(),
        "test",
        "support",
        "files",
        "media_metadata.json"
      ])

    {:ok, file_body} = File.read(json_filepath)
    {:ok, parsed_json} = Phoenix.json_library().decode(file_body)
    merged_attrs = Map.merge(attrs, %{metadata: %{client_respinse: parsed_json}})

    media_item_fixture(merged_attrs)
  end

  def media_item_with_attachments(attrs \\ %{}) do
    stored_media_filepath =
      Path.join([
        Application.get_env(:pinchflat, :media_directory),
        "#{:rand.uniform(1_000_000)}",
        "#{:rand.uniform(1_000_000)}_media.mkv"
      ])

    fixture_media_filepath =
      Path.join([
        File.cwd!(),
        "test",
        "support",
        "files",
        "media.mkv"
      ])

    :ok = File.mkdir_p(Path.dirname(stored_media_filepath))
    :ok = File.cp(fixture_media_filepath, stored_media_filepath)

    merged_attrs = Map.merge(attrs, %{media_filepath: stored_media_filepath})
    media_item_fixture(merged_attrs)
  end
end
