const path = require('path');
const fs = require('fs');
const yaml = require('js-yaml');

const apiKey = process.env.SPONSOR_SHEET_API_KEY;
const sheetId = process.env.SPONSOR_SHEET_ID;

if (!apiKey || !sheetId) {
  console.error('Missing API key or sheet ID');
  process.exit(1);
}

const sheetRange = 'A3:I1001';
const sheetUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${sheetRange}?key=${apiKey}`;

function removeAllSponsors(baseContentDir) {
  console.log('------------------------');
  console.log('Removing sponsors from: ', baseContentDir);
  console.log('------------------------');
  const dataDirPath = path.join(__dirname, '../src/data');
  const contentDirPath = path.join(dataDirPath, baseContentDir);

  const contentDir = fs.readdirSync(contentDirPath);
  contentDir.forEach((content) => {
    console.log('Removing sponsors from: ', content);

    const pageFilePath = path.join(contentDirPath, content, `${content}.md`);
    const pageFileContent = fs.readFileSync(pageFilePath, 'utf8');

    const frontMatterRegex = /---\n([\s\S]*?)\n---/;

    const existingFrontmatter = pageFileContent.match(frontMatterRegex)[1];
    const contentWithoutFrontmatter = pageFileContent
      .replace(frontMatterRegex, ``)
      .trim();

    let frontmatterObj = yaml.load(existingFrontmatter);
    delete frontmatterObj.sponsors;

    const newFrontmatter = yaml.dump(frontmatterObj, {
      lineWidth: 10000,
      forceQuotes: true,
      quotingType: "'",
    });
    const newContent = `---\n${newFrontmatter}---\n${contentWithoutFrontmatter}`;

    fs.writeFileSync(pageFilePath, newContent, 'utf8');
  });
}

function addPageSponsor({
  pageUrl,
  company,
  redirectUrl,
  imageUrl,
  adTitle,
  adDescription,
}) {
  const urlPart = pageUrl
    .replace('https://roadmap.sh/', '')
    .replace(/\?.+?$/, '');

  const parentDir = urlPart.startsWith('best-practices/')
    ? 'best-practices'
    : 'roadmaps';
  const pageId = urlPart.replace(`${parentDir}/`, '');

  const pageFilePath = path.join(
    __dirname,
    `../src/data/${parentDir}`,
    `${pageId}/${pageId}.md`
  );

  if (!fs.existsSync(pageFilePath)) {
    console.error(`Page file not found: ${pageFilePath}`);
    process.exit(1);
  }

  console.log(`Updating page: ${urlPart}`);
  const pageFileContent = fs.readFileSync(pageFilePath, 'utf8');

  const frontMatterRegex = /---\n([\s\S]*?)\n---/;

  const existingFrontmatter = pageFileContent.match(frontMatterRegex)[1];
  const contentWithoutFrontmatter = pageFileContent
    .replace(frontMatterRegex, ``)
    .trim();

  let frontmatterObj = yaml.load(existingFrontmatter);
  const sponsors = frontmatterObj.sponsors || [];

  const frontmatterValues = Object.entries(frontmatterObj);
  const roadmapLabel = frontmatterObj.briefTitle;

  sponsors.push({
    url: redirectUrl,
    title: adTitle,
    imageUrl,
    description: adDescription,
    page: roadmapLabel,
    company,
  });

  // Insert sponsor data at 10 index i.e. after
  // roadmap dimensions in the frontmatter
  frontmatterValues.splice(10, 0, ['sponsors', sponsors]);

  frontmatterObj = Object.fromEntries(frontmatterValues);

  const newFrontmatter = yaml.dump(frontmatterObj, {
    lineWidth: 10000,
    forceQuotes: true,
    quotingType: "'",
  });
  const newContent = `---\n${newFrontmatter}---\n\n${contentWithoutFrontmatter}`;

  fs.writeFileSync(pageFilePath, newContent, 'utf8');
}

// Remove sponsors from all roadmaps
removeAllSponsors('roadmaps');
removeAllSponsors('best-practices');

console.log('------------------------');
console.log('Adding sponsors');
console.log('------------------------');
fetch(sheetUrl)
  .then((res) => res.json())
  .then((rawData) => {
    const rows = rawData.values;

    rows.map((row) => {
      // prettier-ignore
      const [
        pageUrl,
        company,
        redirectUrl,
        imageUrl,
        adTitle,
        adDescription,
        startDate,
        endDate,
        isActive,
      ] = row;

      const isConfiguredActive = isActive?.toLowerCase() === 'yes';
      const currentDate = new Date();
      const isDateInRange =
        currentDate >= new Date(startDate) && currentDate <= new Date(endDate);

      if (!isConfiguredActive || !isDateInRange) {
        return;
      }

      addPageSponsor({
        pageUrl,
        company,
        redirectUrl,
        imageUrl,
        adTitle,
        adDescription,
        startDate,
        endDate,
        isActive,
      });
    });
  });