// @ts-check

import { execSync } from 'child_process';
import { readFileSync } from 'fs';
import { dirname, join, relative } from 'path';
import { fileURLToPath } from 'url';

/**
 * @returns {string[]}
 */
function getDocsIgnoredNotebooks() {
  const CURRENT_DIR_PATH = dirname(fileURLToPath(import.meta.url));
  const ignoreConvertFilePath = join(CURRENT_DIR_PATH, '..', '..', '..', '.ci', 'ignore_convert_full.txt');
  return readFileSync(ignoreConvertFilePath, { encoding: 'utf8' }).split('\n');
}

/**
 * @returns {string}
 */
function getLatestOvReleaseTag() {
  const latestOvReleaseResponse = execSync(
    `curl -L https://api.github.com/repos/openvinotoolkit/openvino/releases/latest`
  ).toString();
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
  const responseJson = /** @type {{ tag_name: string }} */ (JSON.parse(latestOvReleaseResponse));
  if (!responseJson?.tag_name) {
    throw Error(`Unable to fetch latest OpenVINO release via GitHub API. Response: ${latestOvReleaseResponse}.`);
  }
  return responseJson.tag_name;
}

/**
 * @param {string} tag
 * @returns {string[]}
 */
function getAllDocsNotebooksForTag(tag) {
  return execSync(
    `curl -L https://github.com/openvinotoolkit/openvino/raw/${tag}/docs/notebooks/all_notebooks_paths.txt`
  )
    .toString()
    .split('\n');
}

/**
 * @returns {{ latestDocsNotebooks: string[]; latestOVReleaseTag: string}}
 */
function getLatestDocsNotebooksWithTag() {
  const latestOVReleaseTag = getLatestOvReleaseTag();
  const allDocsNotebooks = getAllDocsNotebooksForTag(latestOVReleaseTag);
  const docsIgnoredNotebooks = getDocsIgnoredNotebooks();
  const latestDocsNotebooks = allDocsNotebooks
    .filter((v) => !docsIgnoredNotebooks.includes(v))
    .map((v) => relative('notebooks', v));
  return { latestDocsNotebooks, latestOVReleaseTag };
}

export const docsNotebooks = getLatestDocsNotebooksWithTag();