import { useMemo, useState, useCallback } from "react";
import { useLocalStorage } from "@rehooks/local-storage";
import { useTranslation } from "react-i18next";

import { REPOSITORIES_STORAGE_KEY } from "constants/storage";
import { Repository } from "shared/githubAPI";
import { getRepository } from "services/api";

export function useRepositories() {
  const [
    repositories,
    setRepositories,
  ] = useLocalStorage<Repository[]>(REPOSITORIES_STORAGE_KEY, []);

  const [isLoading, setIsLoading] = useState(false);

  const [t] = useTranslation();

  const addRepository = useCallback(async (repositoryName: string) => {
    const findRepositoryWithTheSameName = repositories.find(
      repository => repositoryName === repository.full_name,
    );

    if (findRepositoryWithTheSameName) {
      throw new Error(t("errors.this_repository_has_already_been_added"));
    }

    try {
      setIsLoading(true);

      const repository = await getRepository(repositoryName);

      setRepositories([
        repository,
        ...repositories,
      ]);
    } catch (err) {
      throw new Error(t("errors.the_repository_could_not_be_found"));
    } finally {
      setIsLoading(false);
    }
  }, [
    t,
    repositories,
    setRepositories,
  ]);

  const payload = useMemo(() => ({
    isLoading,
    repositories,
    addRepository,
  }), [
    isLoading,
    repositories,
    addRepository,
  ]);

  return payload;
}