import {invoke} from "@forge/bridge";
import ForgeReconciler, {
  Box,
  Button,
  Icon,
  Inline, LoadingButton,
  useProductContext,
} from "@forge/react";
import React, {useState} from "react";

const KnowledgeBaseIssueContext = () => {
  const context = useProductContext();
  const [isLoading, setIsLoading] = useState<boolean>();
  const projectKey = context?.extension.project.key;
  const issueKey = context?.extension.issue.key;

  const onClick = async () => {
    setIsLoading(true);
    try {
      const { jobId, success, message } = await invoke('triggerCreateKBJob', {
        projectKey: projectKey,
        issueKey: issueKey
      }) as any;

      if (!success) {
        alert(message);
        return;
      }

      await waitJobFinished(jobId);
    } catch(err) {
      alert('Failed to generate the knowledge base.');
    } finally {
      setIsLoading(false);
    }
  }

  return (
    <>
      <LoadingButton appearance="primary" onClick={onClick} isLoading={isLoading}>
        <Inline alignBlock="center" space={"space.100"}>
          <Icon glyph={'add-item'} size="small" label={'Generate Knowledge Base'}/>
          <Box>Generate Knowledge Base</Box>
        </Inline>
      </LoadingButton>
      {/*<Button onClick={async () => {*/}
      {/*  await invoke('getBugIssueInformation');*/}
      {/*}}>Test</Button>*/}
    </>
  )
}

export function waitJobFinished(jobId: string, interval: number = 2000) {
  return new Promise((resolve, reject) => {
    const intervalId = setInterval(async () => {
      try {
        const { success, failed } = await invoke('getCreateKBJob', {
          jobId: jobId
        }) as any;
        if (success === 1) {
          clearInterval(intervalId);
          resolve(null);
        } else if (failed === 1) {
          reject(new Error(`Failed to finish the job ${jobId}.`));
        }
      } catch (err) {
        reject(err);
      }
    }, interval);
  });
}

ForgeReconciler.render(
  <React.StrictMode>
    <KnowledgeBaseIssueContext />
  </React.StrictMode>
);
