import { getClaudeClient, CLAUDE_MODEL } from '@/lib/claude';
import { ParsedPDFLine, Supplier } from '@/types';

export async function extractPDFLines(
  pdfBase64: string,
  supplier: Supplier
): Promise<ParsedPDFLine[]> {
  const claude = getClaudeClient();

  const supplierContext: Record<Supplier, string> = {
    signia: `Facture Signia (WS Audiology). Les appareils auditifs sont dans la famille "PR" (Produits). Cherche les colonnes : Code Article, Description, Prix Unitaire Net, Quantité.`,
    resound: `Facture ReSound (GN Hearing). Les appareils auditifs sont dans la famille "CONTOUR". Cherche les colonnes : Code Article, Description, Prix Unitaire Brut, Quantité.`,
    starkey: `Facture Starkey. Les appareils auditifs sont dans la famille "PR". Cherche les colonnes : Code Article, Description, Prix HT, Quantité.`,
  };

  const response = await claude.messages.create({
    model: CLAUDE_MODEL,
    max_tokens: 4096,
    messages: [
      {
        role: 'user',
        content: [
          {
            type: 'document',
            source: {
              type: 'base64',
              media_type: 'application/pdf',
              data: pdfBase64,
            },
          } as never,
          {
            type: 'text',
            text: `Extrais toutes les lignes de cette facture d'appareils auditifs.

Contexte : ${supplierContext[supplier]}

Extrais UNIQUEMENT les appareils auditifs (pas les accessoires, éco-taxe, port, réparations).

Réponds UNIQUEMENT avec un JSON array (pas de markdown) :
[{"code_article": "...", "description": "...", "unit_price": 123.45, "quantity": 1}]

Si tu ne peux pas extraire les données, réponds avec un tableau vide : []`,
          },
        ],
      },
    ],
  });

  const text = response.content[0].type === 'text' ? response.content[0].text : '[]';

  try {
    const jsonMatch = text.match(/\[[\s\S]*\]/);
    if (!jsonMatch) return [];

    const parsed = JSON.parse(jsonMatch[0]) as ParsedPDFLine[];
    return parsed.filter(
      (line) => line.code_article && line.unit_price > 0
    );
  } catch {
    return [];
  }
}
