defmodule Mobilizon.Web.ManifestController do
  use Mobilizon.Web, :controller

  alias Mobilizon.Config
  alias Mobilizon.Medias.Media

  @spec manifest(Plug.Conn.t(), any) :: Plug.Conn.t()
  def manifest(conn, _params) do
    favicons =
      case Config.instance_favicon() do
        %Media{file: %{url: url}, metadata: metadata} ->
          [
            Map.merge(
              %{
                src: url
              },
              case metadata do
                %{width: width} -> %{sizes: "#{width}x#{width}"}
                _ -> %{}
              end
            )
          ]

        _ ->
          [
            %{
              src: "./img/icons/android-chrome-512x512.png",
              sizes: "512x512",
              type: "image/png"
            },
            %{
              src: "./img/icons/android-chrome-192x192.png",
              sizes: "192x192",
              type: "image/png"
            }
          ]
      end

    json(conn, %{
      name: Config.instance_name(),
      start_url: "/",
      scope: "/",
      display: "standalone",
      background_color: "#ffffff",
      theme_color: "#ffd599",
      orientation: "portrait-primary",
      icons: favicons
    })
  end

  @spec favicon(Plug.Conn.t(), any) :: Plug.Conn.t()
  def favicon(conn, _params) do
    case Config.instance_favicon() do
      %Media{file: %{url: url}} -> redirect(conn, external: url)
      _ -> redirect(conn, to: "/img/icons/favicon.ico")
    end
  end
end