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

function extractCentreFromDeliveryName(raw: string | undefined | null): string {
  if (!raw) return '';
  const stripped = raw
    .replace(/^VIVASON\s+(GROUPE?|ALPHA|GAMMA|BETA|DELTA)\s+/i, '')
    .replace(/^VIVASON\s*/i, '')
    .trim();
  const remainder = stripped.toUpperCase();
  if (!remainder || remainder === 'GROUP' || remainder === 'GROUPE') return 'Siège';
  return stripped.charAt(0).toUpperCase() + stripped.slice(1).toLowerCase();
}

export async function parseBiotonePDF(pdfBase64: string): Promise<ParsedEDILine[]> {
  const claude = getClaudeClient();

  const response = await claude.messages.create({
    model: CLAUDE_MODEL,
    max_tokens: 8000,
    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 facturation de cette facture Biotone (fournisseur de matériel d'atelier et produits d'entretien pour audioprothésistes).

Format attendu de la facture :
Référence | Désignation | Quantité | U.V | Prix unitaire | Remise (%) | Montant

RÈGLES :
- Extrais CHAQUE ligne produit avec sa référence, désignation, quantité, prix unitaire et remise
- Le "Prix unitaire" est parfois un prix au lot (U.V = C12 = carton de 12). Dans ce cas, calcule le prix UNITAIRE (prix / nombre d'unités dans le lot)
- Si U.V = "U", le prix unitaire est déjà le prix à l'unité
- Si U.V = "C12", "C24", "C6", etc., divise le prix par le chiffre (12, 24, 6)
- Calcule le prix net unitaire = prix unitaire × (1 - remise/100)
- EXCLURE les lignes de port (Port Local, Port UE, Port Export, TRANSPORT, LIVRAISON)
- EXCLURE les lignes de sous-total ou total
- Les nombres utilisent la virgule comme séparateur décimal (ex: 14,000 = 14.00)
- IMPORTANT : Extrais aussi le nom du destinataire dans l'encadré "Adresse de Livraison" (première ligne, ex: "VIVASON ALPHA NICE"). Retourne-le dans le champ "delivery_name".

Réponds UNIQUEMENT avec un JSON object (pas de markdown, pas de backticks) :
{"delivery_name": "VIVASON ALPHA NICE", "lines": [{"reference": "10977359", "designation": "CARTE DE 10 CURE OREILLE", "quantity": 3, "unit_price_gross": 14.00, "uv": "U", "unit_price_net": 14.00, "discount_percent": 0, "invoice_number": "FA123456"}]}

- delivery_name : le nom du destinataire de la livraison (première ligne de l'encadré "Adresse de Livraison")
- reference : code article Biotone
- designation : nom du produit
- quantity : nombre commandé
- unit_price_gross : prix unitaire avant remise (si U.V ≠ "U", diviser par le nombre d'unités)
- uv : unité de vente (U, C12, C24...)
- unit_price_net : prix unitaire après remise
- discount_percent : pourcentage de remise (0 si pas de remise)
- invoice_number : numéro de facture (si visible en haut de page)

Si tu ne trouves aucune ligne, réponds : {"delivery_name": "", "lines": []}`,
          },
        ],
      },
    ],
  });

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

  try {
    const cleanText = text.replace(/^```(?:json)?\s*/i, '').replace(/\s*```\s*$/, '').trim();

    let deliveryName = '';
    let lines: {
      reference: string;
      designation: string;
      quantity: number;
      unit_price_gross: number;
      uv: string;
      unit_price_net: number;
      discount_percent: number;
      invoice_number?: string;
    }[] = [];

    const objectMatch = cleanText.match(/\{[\s\S]*\}/);
    if (objectMatch) {
      const obj = JSON.parse(objectMatch[0]);
      deliveryName = obj.delivery_name || '';
      lines = Array.isArray(obj.lines) ? obj.lines : [];
    } else {
      const arrayMatch = cleanText.match(/\[[\s\S]*\]/);
      if (arrayMatch) lines = JSON.parse(arrayMatch[0]);
    }

    const centre = extractCentreFromDeliveryName(deliveryName);

    return lines
      .filter((line) => line.reference && line.unit_price_net > 0)
      .map((line) => ({
        centre_code: '',
        centre_name: centre,
        code_article: String(line.reference).trim(),
        description: String(line.designation).trim(),
        quantity: line.quantity || 1,
        unit_price: Math.round(line.unit_price_net * 100) / 100,
        discount_pct: line.discount_percent || 0,
        invoice_number: line.invoice_number || '',
        invoice_date: '',
        sign: '+',
        famille: 'BIOTONE',
      }));
  } catch {
    console.error('[BIOTONE PDF] Failed to parse Claude response');
    return [];
  }
}
