const TYPE_MAP: Record<string, string> = {
  '1061': 'basis',
  '1064': 'basis',
  '1484': 'basis',
  '1001': 'basis',
  '1055': 'glas',
  '1036': 'beschattung',
  '1477': 'beschattung',
  '1037': 'beschattung',
  '1059': 'beschattung',
  '1117': 'beschattung',
  '1096': 'beschattung',
  '1546': 'beschattung',
  '1553': 'verglasung',
  '1025': 'verglasung',
  '1554': 'verglasung',
  '1134': 'verglasung',
  '1135': 'verglasung',
  '1136': 'verglasung',
  '1137': 'verglasung',
  '1045': 'verglasung',
  '1049': 'verglasung',
  '1048': 'verglasung',
  '1040': 'verglasung',
  '1083': 'verglasung',
  '1081': 'verglasung',
  '1087': 'verglasung',
  '1084': 'verglasung',
  '1085': 'verglasung',
  '1041': 'verglasung',
  '1042': 'verglasung',
  '1058': 'verglasung',
  '1547': 'beleuchtung',
  '1250': 'beleuchtung',
  '1485': 'beleuchtung',
  '1180': 'steuerung',
  '1165': 'steuerung',
  '1184': 'steuerung',
  '1321': 'steuerung',
  '1099': 'steuerung',
  '1245': 'steuerung',
  '1291': 'steuerung',
  '1292': 'steuerung',
  '1293': 'steuerung',
  '1367': 'accessoire',
  '1548': 'accessoire',
  '1090': 'baugesuch',
  '1551': 'dienstleistung',
  '1544': 'dienstleistung',
  '1094': 'fremdleistung',
  '1097': 'fremdleistung',
};

const typeFor = (id: string) => {
  if (id?.startsWith?.('Sonnenkollektoren')) return 'accessoire';
  return TYPE_MAP[id] ?? 'accessoire';
};

export interface HubspotPayloadInput {
  project?: string;
  profile?: {
    email?: string;
    firstName?: string;
    lastName?: string;
    phone?: string;
    street?: string;
    stNumber?: string;
    postcode?: string;
    location?: string;
  };
  order?: any[];
  colors?: { label: string; name: string }[];
  totalPrice?: number;
  comment?: string;
}

export function buildConfigurationPayload(input: HubspotPayloadInput) {
  const grouped = new Map<string, any>();
  for (const item of input.order ?? []) {
    const qty = item.qty && item.qty > 0 ? item.qty : 1;
    const unit_price_chf = Math.round(item.base_total_chf / qty);
    const key = `${item.id}|${item.subType ?? ''}|${unit_price_chf}|${
      item.area_m2 ?? ''
    }|${item.konfig_masse ?? ''}`;

    const existing = grouped.get(key);
    if (existing) {
      existing.quantity += qty;
    } else {
      const li: any = {
        type: typeFor(item.id),
        name: item.name,
        sku: `${item.id}`,
        quantity: qty,
        unit_price_chf,
      };
      if (item.area_m2 != null) {
        li.area_m2 = item.area_m2;
        li.unit_price_m2_chf = item.unit_price_m2_chf;
      }
      if (item.konfig_masse || item.subType) {
        li.konfig_masse = item.subType
          ? `${item.konfig_masse ?? ''}${
              item.konfig_masse ? ' ' : ''
            }(${item.subType})`
          : item.konfig_masse;
      }
      grouped.set(key, li);
    }
  }
  const allItems = Array.from(grouped.values());
  const basisItems = allItems.filter((li) => li.type === 'basis');
  const restItems = allItems.filter((li) => li.type !== 'basis');

  const colorItems = (input.colors ?? []).map((c) => ({
    type: 'farbe',
    name: `${c.label}: ${c.name}`,
  }));

  const led1547Items = (input.order ?? []).filter(
    (it) => `${it.id}` === '1547',
  );
  const seenLedColors = new Set<string>();
  for (const led of led1547Items) {
    const ledRgbVar = led.Variables?.find(
      (v: any) => v.VariableName === 'RGB',
    );
    if (!ledRgbVar) continue;
    const name =
      Number(ledRgbVar.VariableValue) === 1 ? 'led-RGB' : 'led-Warmweiss';
    if (seenLedColors.has(name)) continue;
    seenLedColors.add(name);
    colorItems.push({ type: 'farbe', name });
  }

  const lineItems: any[] = [...basisItems, ...restItems, ...colorItems];

  const basis = lineItems.find((li) => li.type === 'basis');
  const basisName = basis?.name ?? 'Konfiguration';
  const lastName = input.profile?.lastName ?? '';

  return {
    config_id: `${input.project ?? ''}`,
    contact: {
      email: `${input.profile?.email ?? ''}`,
      firstname: `${input.profile?.firstName ?? ''}`,
      lastname: `${lastName}`,
      phone: `${input.profile?.phone ?? ''}`,
      address: `${input.profile?.street ?? ''} ${
        input.profile?.stNumber ?? ''
      }`.trim(),
      zip: `${input.profile?.postcode ?? ''}`,
      city: `${input.profile?.location ?? ''}`,
      country: 'CH',
    },
    deal: {
      name: `${basisName} — ${lastName}`,
      amount_chf: Number(input.totalPrice ?? 0),
    },
    quote: {
      title: `Offerte ${basisName} — ${lastName}`,
      language: 'de',
      currency: 'CHF',
      comments_to_buyer: `${input.comment ?? ''}`,
    },
    line_items: lineItems,
  };
}

export function addDays(days: number) {
  const d = new Date();
  d.setDate(d.getDate() + days);
  return d.toISOString().slice(0, 10);
}
