import { describe, it, expect } from 'vitest';
import { readFileSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = dirname(fileURLToPath(import.meta.url));

/** URL extraction logic mirrored from extension/content.js */
function extractFromUrl(url: string) {
  const patterns = [
    /\/boards\/(\d+)\/pulses\/(\d+)/,
    /\/boards\/(\d+)\/items\/(\d+)/,
    /\/boards\/(\d+).*?[?&]pulse_id=(\d+)/,
  ];
  for (const re of patterns) {
    const m = url.match(re);
    if (m) {
      return { board_id: m[1], item_id: m[2], source_external_id: `monday-${m[1]}-${m[2]}` };
    }
  }
  return { source_external_id: `monday-url-fallback` };
}

function extractFromFixtureHtml(html: string, url: string) {
  const urlData = extractFromUrl(url);
  const titleMatch = html.match(/data-testid="item-name"[^>]*>([^<]+)</);
  const bodyMatch = html.match(/data-testid="item-description"[^>]*>\s*([\s\S]*?)<\/div>/);
  const authorMatch = html.match(/data-testid="creator-name"[^>]*>([^<]+)</);
  const boardMatch = html.match(/data-testid="breadcrumb"[^>]*>([^<]+)</);
  return {
    source_external_id: urlData.source_external_id,
    title: titleMatch?.[1]?.trim(),
    body: bodyMatch?.[1]?.replace(/\s+/g, ' ').trim(),
    sender_name: authorMatch?.[1]?.trim(),
    client_project: boardMatch?.[1]?.split('/')[0]?.trim(),
  };
}

describe('Monday extractor (fixture HTML — TEST EXTRACTEUR)', () => {
  const fixture = readFileSync(resolve(__dirname, '../scripts/fixtures/monday-item.html'), 'utf8');
  const url = 'https://acme.monday.com/boards/123456/pulses/9876543';

  it('extracts board/item id from URL', () => {
    const r = extractFromUrl(url);
    expect(r.source_external_id).toBe('monday-123456-9876543');
  });

  it('extracts title, body, author from fixture DOM', () => {
    const r = extractFromFixtureHtml(fixture, url);
    expect(r.title).toBe('Migration serveur urgente');
    expect(r.body).toContain('DNS');
    expect(r.sender_name).toBe('Marie Dupont');
    expect(r.client_project).toBe('Board Support');
  });
});

describe('Monday dedup key alignment', () => {
  it('API and Chrome share external_id format monday-{board}-{item}', () => {
    const apiId = `monday-123-456789`;
    const chromeId = `monday-123-456789`;
    expect(apiId).toBe(chromeId);
  });
});
