import { useMemo, useState } from "react";
import { getListensReport, getRecentListens, getTopArtists } from "../api/api";
import { ListenReportOptions } from "../api/entities/listen-report-options";
import { PaginationOptions } from "../api/entities/pagination-options";
import { TopArtistsOptions } from "../api/entities/top-artists-options";
import { useApiClient } from "./use-api-client";
import { useAsync } from "./use-async";

const INITIAL_EMPTY_ARRAY: [] = [];
Object.freeze(INITIAL_EMPTY_ARRAY);

export const useRecentListens = (options: PaginationOptions) => {
  const { client } = useApiClient();

  const fetchData = useMemo(() => () => getRecentListens(options, client), [
    options,
    client,
  ]);

  const { value, pending: isLoading, error, reload } = useAsync(
    fetchData,
    undefined
  );

  const recentListens = value ? value.items : [];
  const paginationMeta = value ? value.meta : undefined;

  return { recentListens, paginationMeta, isLoading, error, reload };
};

export const useListensReport = (options: ListenReportOptions) => {
  const { client } = useApiClient();

  const fetchData = useMemo(() => () => getListensReport(options, client), [
    options,
    client,
  ]);

  const { value: report, pending: isLoading, error } = useAsync(
    fetchData,
    INITIAL_EMPTY_ARRAY
  );

  return { report, isLoading, error };
};

export const useTopArtists = (options: TopArtistsOptions) => {
  const { client } = useApiClient();

  const fetchData = useMemo(() => () => getTopArtists(options, client), [
    options,
    client,
  ]);

  const { value: topArtists, pending: isLoading, error } = useAsync(
    fetchData,
    INITIAL_EMPTY_ARRAY
  );

  return { topArtists, isLoading, error };
};
