import { ParsedEDILine, Supplier } from '@/types';

// Lines to exclude: eco-taxe, port, réparations, garanties, avoirs (negative)
const EXCLUDE_DESCRIPTIONS = [
  'ecotaxe', 'eco-taxe', 'eco taxe', 'deee',
  'port', 'frais de port', 'transport',
  'reparation', 'réparation', 'repair',
  'garantie', 'warranty', 'extension garantie',
];

// Famille → category mapping per supplier
// Signia: PR = appareils, AC = accessoires, EN = entretien
// ReSound: CONTOUR = appareils, ACCE = accessoires, ENTR = entretien
// Starkey: PR = appareils, AC = accessoires, EN = entretien
const FAMILLE_CATEGORY_MAP: Record<string, Record<string, string>> = {
  signia: { PR: 'appareils', AC: 'accessoires', EN: 'entretien' },
  resound: { CONTOUR: 'appareils', ACCE: 'accessoires', ENTR: 'entretien' },
  starkey: { PR: 'appareils', AC: 'accessoires', EN: 'entretien' },
};

export function filterEDILines(
  lines: ParsedEDILine[],
  supplier: Supplier,
  options?: {
    categories?: { appareils: boolean; accessoires: boolean; entretien: boolean };
    scope?: 'all' | 'suc' | 'franchise';
    sucCodes?: Set<string>;
  }
): { filtered: ParsedEDILine[]; alerts: string[] } {
  const alerts: string[] = [];
  const filtered: ParsedEDILine[] = [];
  const familleMap = FAMILLE_CATEGORY_MAP[supplier] || {};

  // Build set of allowed families based on categories
  const allowedFamilies = new Set<string>();
  const cats = options?.categories ?? { appareils: true, accessoires: true, entretien: true };
  for (const [famille, category] of Object.entries(familleMap)) {
    if (cats[category as keyof typeof cats]) {
      allowedFamilies.add(famille);
    }
  }

  for (const line of lines) {
    // Filter by famille/category
    if (allowedFamilies.size > 0 && line.famille) {
      if (!allowedFamilies.has(line.famille)) continue;
    } else if (!line.famille && allowedFamilies.size > 0) {
      // If no famille field, include by default (backwards compat)
    }

    // Skip credit notes
    if (line.sign === '-') continue;

    // Skip zero or negative prices
    if (line.unit_price <= 0) continue;

    // Skip excluded descriptions
    const descLower = line.description.toLowerCase();
    if (EXCLUDE_DESCRIPTIONS.some((exc) => descLower.includes(exc))) continue;

    // Alert: 0% discount and amount > 500€
    if (line.discount_pct === 0 && line.unit_price > 500) {
      alerts.push(
        `Alerte: ${line.code_article} (${line.description}) — prix ${line.unit_price}€ sans remise`
      );
    }

    // Scope filter (SUC vs franchise)
    if (options?.scope === 'suc' && options.sucCodes) {
      const key = supplier === 'resound' ? line.centre_name : line.centre_code;
      if (!options.sucCodes.has(key)) continue;
    } else if (options?.scope === 'franchise' && options.sucCodes) {
      const key = supplier === 'resound' ? line.centre_name : line.centre_code;
      if (options.sucCodes.has(key)) continue;
    }

    filtered.push(line);
  }

  return { filtered, alerts };
}
