import * as cheerio from 'cheerio';
import { query, queryOne } from '../db';

const BASE_URL = process.env.APP_BASE_URL || 'http://localhost:3002';

interface TrackedLink {
  id: string;
  tracking_token: string;
}

export async function rewriteLinks(
  html: string,
  campaignId: string,
  recipientToken: string
): Promise<string> {
  const $ = cheerio.load(html, { decodeEntities: false });

  const anchors = $('a[href]').toArray();

  for (const el of anchors) {
    const originalUrl = $(el).attr('href') || '';

    // Skip non-http links and already-tracked links
    if (
      !originalUrl ||
      originalUrl.startsWith('mailto:') ||
      originalUrl.startsWith('#') ||
      originalUrl.includes('/track/click/')
    ) {
      continue;
    }

    // Look up or create tracked link
    let link = await queryOne<TrackedLink>(
      'SELECT id, tracking_token FROM tracked_links WHERE campaign_id = $1 AND original_url = $2',
      [campaignId, originalUrl]
    );

    if (!link) {
      const inserted = await queryOne<TrackedLink>(
        'INSERT INTO tracked_links (campaign_id, original_url) VALUES ($1, $2) RETURNING id, tracking_token',
        [campaignId, originalUrl]
      );
      link = inserted;
    }

    if (link) {
      const trackUrl = `${BASE_URL}/track/click/${link.tracking_token}.${recipientToken}`;
      $(el).attr('href', trackUrl);
    }
  }

  return $.html();
}
