import useSWR from "swr";
import queryString from "query-string";

import fetcher from "./fetcher";

export interface GithubIssueListItemUser {
  login: string;
  avatar_url: string;
}

export interface GithubIssueListItem {
  owner: string;
  repo: string;
  issueNumber: number;
  status: string;
  expectedRespondAt?: string;
  actionOwner?: string;
  data: {
    id: number;
    user: GithubIssueListItemUser;
    created_at: string;
    updated_at: string;
    title: string;
    labels: Array<{
      id: number;
      name: string;
      color: string;
      description: string;
    }>;
    assignees: Array<GithubIssueListItemUser>;
    pull_request?: {};
  };
}

export interface GithubIssueList {
  items: Array<GithubIssueListItem>;
  total: number;
  page: number;
  pageSize: number;
}

export type GithubIssueListStatus =
  | "TO_BE_REVIEWED"
  | "REVIEWED"
  | "TRIAGED"
  | "CLOSED";
export type GithubIssueListSort =
  | "EXPECTED_RESPOND_AT_ASC"
  | "EXPECTED_RESPOND_AT_DESC";

export interface GithubIssueListParams {
  owner?: string;
  repo?: string;
  isPullRequest?: boolean;
  status?: GithubIssueListStatus;
  page?: number;
  pageSize?: number;
  actionOwner?: string;
  sort?: GithubIssueListSort;
  labels?: Array<string>;
  extraLabels?: Array<string>;
}

export function useGithubIssueList(
  params?: GithubIssueListParams
): GithubIssueListResult {
  let newParams = undefined;
  if (params) {
    newParams = { ...params };
  }

  if (newParams && newParams.extraLabels) {
    if (!newParams.labels) {
      newParams.labels = [];
    }
    newParams.labels = [...newParams.labels, ...newParams.extraLabels];
    newParams.extraLabels = undefined;
  }

  const { data, error } = useSWR(
    queryString.stringifyUrl(
      { url: "/api/github/issues", query: newParams as any },
      { skipNull: true }
    ),
    fetcher,
    {
      refreshInterval: 60000,
    }
  );
  return {
    data: data as GithubIssueList,
    error,
    loading: !error && !data,
  };
}

export interface GithubIssueListResult {
  data?: GithubIssueList;
  error?: any;
  loading: boolean;
}

export function useGithubIssueListActionOwner(params?: GithubIssueListParams) {
  const { data, error } = useSWR(
    queryString.stringifyUrl(
      { url: "/api/github/issues/owners", query: params as any },
      { skipNull: true }
    ),
    fetcher,
    {
      refreshInterval: 60000,
    }
  );
  return {
    data: data as Array<string>,
    error,
    loading: !error && !data,
  };
}

export function useGithubIssueListLabel(params?: GithubIssueListParams) {
  const { data, error } = useSWR(
    queryString.stringifyUrl(
      { url: "/api/github/issues/labels", query: params as any },
      { skipNull: true }
    ),
    fetcher,
    {
      refreshInterval: 60000,
    }
  );
  return {
    data: data as Array<string>,
    error,
    loading: !error && !data,
  };
}