const fs = require('fs');
const path = require('path');
const yaml = require('json-to-pretty-yaml');
const roadmapMetas = require('./roadmap-metas.cjs');

const oldAssetsPath = path.join(__dirname, 'developer-roadmap/public');
const newAssetsPath = path.join(__dirname, '../public/');

// Create JSONs dir
const newJsonsPath = path.join(newAssetsPath, 'jsons');
if (fs.existsSync(newJsonsPath)) {
  fs.rmSync(newJsonsPath, { recursive: true });
}

fs.mkdirSync(newJsonsPath);

// Create PDFs dir
const newPdfsPath = path.join(newAssetsPath, 'pdfs');
if (fs.existsSync(newPdfsPath)) {
  fs.rmSync(newPdfsPath, { recursive: true });
}

fs.mkdirSync(newPdfsPath);

const oldRoadmapsDirPath = path.join(__dirname, 'developer-roadmap/content/roadmaps');
const newRoadmapsDirPath = path.join(__dirname, '../src/roadmaps');

if (fs.existsSync(newRoadmapsDirPath)) {
  fs.rmSync(newRoadmapsDirPath, { recursive: true });
}

fs.mkdirSync(newRoadmapsDirPath);

const oldRoadmaps = fs
  .readdirSync(oldRoadmapsDirPath)
  .map((roadmapDirName) => path.join(oldRoadmapsDirPath, roadmapDirName));

const orderInfo = {};
const typeCounter = {
  role: 1,
  tool: 1,
};

// Calculate the sorting information for the roadmaps
oldRoadmaps.forEach((oldRoadmapPath) => {
  const roadmapId = path.basename(oldRoadmapPath).replace(/\d+-/g, '').toLowerCase();
  const oldRoadmapMeta = require(path.join(oldRoadmapPath, 'meta.json'));

  orderInfo[roadmapId] = typeCounter[oldRoadmapMeta.type];
  typeCounter[oldRoadmapMeta.type] += 1;
});

// Iterate and create new roadmaps
oldRoadmaps.forEach((oldRoadmapPath) => {
  const roadmapId = path.basename(oldRoadmapPath).replace(/\d+-/g, '').toLowerCase();

  const metaToMerge = roadmapMetas[roadmapId] ?? {};
  const oldRoadmapMeta = require(path.join(oldRoadmapPath, 'meta.json'));
  const isTextual = oldRoadmapMeta?.landingPath?.endsWith('.md');

  const hasContentDir = fs.existsSync(path.join(oldRoadmapPath, 'content'));

  const roadmapFileContent = isTextual
    ? fs.readFileSync(path.join(oldRoadmapPath, oldRoadmapMeta.landingPath), 'utf8')
    : '';

  const roadmapFileContentWithUpdatedUrls = roadmapFileContent
    .replace(/\[\!\[\]\((.+?\.png)\)\]\((.+?\.png)\)/g, '[![](/assets$1)](/assets$2)')
    .replace(/\[\!\[\]\((.+?\.svg)\)\]\((.+?\.svg)\)/g, '[![](/assets$1)](/assets$2)')
    .replace(/\[\!\[\]\((.+?\.svg)\)\]\((.+?\.png)\)/g, '[![](/assets$1)](/assets$2)')
    .replace(/assetshttp\//g, 'http')
    .replace(/assetshttps:\/\//g, 'https://')
    .replace(/\/http/g, 'http')
    .replace(/]\(\/roadmaps\/(.+?)\.png\)/g, '](/assets/roadmaps/$1.png)')
    .replace(/]\(\/roadmaps\/(.+?)\.svg\)/g, '](/assets/roadmaps/$1.svg)')
    .replace(/<iframe/g, '<iframe class="w-full aspect-video mb-5"')
    .replace(/<iframe(.+?)\s?\/>/g, '<iframe$1></iframe>');

  const hasJson = fs.existsSync(path.join(oldAssetsPath, `/project/${roadmapId}.json`));

  const newRoadmapMeta = {
    ...( hasJson ? { jsonUrl: `/jsons/${roadmapId}.json`} : {}),
    pdfUrl: `/pdfs/${roadmapId}.pdf`,
    order: orderInfo[roadmapId],
    featuredTitle:
      oldRoadmapMeta.featuredTitle === 'Software Design and Architecture'
        ? 'Software Design'
        : oldRoadmapMeta.featuredTitle,
    featuredDescription: oldRoadmapMeta.featuredDescription,
    title: oldRoadmapMeta.title,
    description: oldRoadmapMeta.description,
    isNew: oldRoadmapMeta.isNew,
    hasTopics: hasContentDir,
    ...metaToMerge,
    seo: oldRoadmapMeta.seo,
    relatedRoadmaps: oldRoadmapMeta.relatedRoadmaps,
    sitemap: {
      priority: 1,
      changefreq: 'monthly',
    },
    tags: ['roadmap', 'main-sitemap', `${oldRoadmapMeta.type === 'tool' ? 'skill' : oldRoadmapMeta.type}-roadmap`],
  };

  const frontmatter = yaml.stringify(newRoadmapMeta);
  const newRoadmapDirPath = path.join(newRoadmapsDirPath, roadmapId);
  const newRoadmapFilePath = path.join(newRoadmapDirPath, `/${roadmapId}.md`);

  fs.mkdirSync(newRoadmapDirPath);
  fs.writeFileSync(newRoadmapFilePath, `---\n${frontmatter}---\n\n${roadmapFileContentWithUpdatedUrls}`);

  const jsonFile = path.join(oldAssetsPath, oldRoadmapMeta.jsonUrl || '/unknown');
  const pdfFile = path.join(oldAssetsPath, oldRoadmapMeta.pdfUrl || '/unknown');

  if (fs.existsSync(jsonFile)) {
    fs.copyFileSync(jsonFile, path.join(newJsonsPath, `${roadmapId}.json`));
  }

  if (fs.existsSync(pdfFile)) {
    fs.copyFileSync(pdfFile, path.join(newPdfsPath, `${roadmapId}.pdf`));
  }

  // Copy the content directory
  const oldRoadmapContentDir = path.join(oldRoadmapPath, 'content');
  if (fs.existsSync(oldRoadmapContentDir)) {
    fs.cpSync(oldRoadmapContentDir, path.join(newRoadmapDirPath, 'content'), { recursive: true });
  }
});

const roadmapAssets = path.join(oldAssetsPath, 'roadmaps');
if (fs.existsSync(roadmapAssets)) {
  fs.cpSync(roadmapAssets, path.join(newAssetsPath, 'roadmaps'), { recursive: true });
}