/* crm-data.jsx — Sample data for the prototype */

const CRM_CUSTOMERS = [
  {id:'HTL-26-0142', name:'Hotel Sereno', loc:'Comporta',          nif:'509 280 471', kind:'Hotel',     contact:'Maria Antunes'},
  {id:'SPA-26-0091', name:'Spa Salgueiros', loc:'Vidago',          nif:'510 882 091', kind:'Spa',       contact:'Rui Marçal'},
  {id:'GYM-26-0073', name:'Atlas Athletic', loc:'Leiria',          nif:'508 412 778', kind:'Ginásio',   contact:'Inês Bento'},
  {id:'BRB-26-0058', name:'Barbearia Lapa', loc:'Lisboa',          nif:'511 920 334', kind:'Barbearia', contact:'Pedro Tavares'},
  {id:'HTL-25-0021', name:'Casa do Mar', loc:'Cascais',            nif:'507 110 552', kind:'Hotel',     contact:'Luísa Fontes'},
  {id:'SPA-26-0044', name:'Termas Calmas', loc:'Caldas da Rainha', nif:'509 880 113', kind:'Spa',       contact:'Hugo Bettencourt'},
  {id:'HTL-26-0166', name:'Tróia Resort', loc:'Tróia',             nif:'508 661 042', kind:'Hotel',     contact:'Patrícia Costa'},
  {id:'GYM-26-0102', name:'CrossFit Marrazes', loc:'Leiria',       nif:'512 040 188', kind:'Ginásio',   contact:'Ana Dinis'},
  {id:'BRB-26-0079', name:'Barbearia Aço', loc:'Leiria',           nif:'511 200 944', kind:'Barbearia', contact:'Joaquim Sá'},
  {id:'HTL-26-0151', name:'Hotel Eurosol', loc:'Leiria',           nif:'502 110 088', kind:'Hotel',     contact:'Rita Henriques'},
  {id:'SPA-25-0019', name:'Hammam Bairro', loc:'Porto',            nif:'509 442 776', kind:'Spa',       contact:'Marco Sevilha'},
  {id:'GYM-26-0118', name:'Forma Estúdio', loc:'Aveiro',           nif:'511 880 412', kind:'Ginásio',   contact:'Catarina Vaz'},
  {id:'BRB-26-0092', name:'Old Boys Barber', loc:'Coimbra',        nif:'510 339 008', kind:'Barbearia', contact:'Tiago Mendes'},
  {id:'HTL-26-0177', name:'Quinta da Pousa', loc:'Évora',          nif:'508 992 011', kind:'Hotel',     contact:'Marta Cabral'},
  {id:'SPA-26-0061', name:'Spa Vitalis', loc:'Funchal',            nif:'512 660 401', kind:'Spa',       contact:'Bruno Câmara'},
  {id:'HTL-26-0188', name:'Boutique Algés', loc:'Algés',           nif:'511 044 098', kind:'Hotel',     contact:'Sofia Lemos'},
  {id:'GYM-26-0131', name:'Hex Athletic', loc:'Porto',             nif:'510 880 333', kind:'Ginásio',   contact:'Diogo Albuquerque'},
  {id:'BRB-26-0114', name:'Casa do Pente', loc:'Braga',            nif:'509 661 088', kind:'Barbearia', contact:'Fábio Lopes'},
];

const CRM_PRODUCTS = [
  {code:'CDR-SHM-5L',  name:'Champô',           scent:'Cedar & Sandalwood',     fmt:'5 L · recarga inox', cat:'cabelo',    vat:23, price:46.00,  kind:'bottle'},
  {code:'BGP-SBL-5L',  name:'Sabonete líquido', scent:'Bergamot & Patchouli',   fmt:'5 L · recarga inox', cat:'corpo',     vat:23, price:42.00,  kind:'jar'},
  {code:'SLT-LOC-1L',  name:'Loção corpo',      scent:'Sea Salt',               fmt:'1 L · refill PET',   cat:'corpo',     vat:23, price:18.00,  kind:'tube'},
  {code:'SLT-SBR-12',  name:'Sabonete barra',   scent:'Sea Salt',               fmt:'120 g · papel',      cat:'corpo',     vat:23, price:6.40,   kind:'bar'},
  {code:'CDR-OLB-30',  name:'Óleo barba',       scent:'Cedar & Sandalwood',     fmt:'300 ml · vidro',     cat:'barba',     vat:23, price:24.50,  kind:'bottle'},
  {code:'BGP-PCB-10',  name:'Pasta de cabelo',  scent:'Bergamot & Patchouli',   fmt:'100 ml · alumínio',  cat:'cabelo',    vat:23, price:14.20,  kind:'jar'},
  {code:'LNH-TLR-46',  name:'Toalha rosto',     scent:'linho cru',              fmt:'40 × 60 cm',         cat:'vestuário', vat:23, price:8.80,   kind:'bar'},
  {code:'ALG-RPN-ML',  name:'Roupão',           scent:'algodão escovado',       fmt:'M · L · XL',         cat:'vestuário', vat:23, price:62.00,  kind:'bar'},
];

// Contract states
const STATE_OPTIONS = [
  {k:'active',    label:'Ativo',           hint:'Ciclos a correr'},
  {k:'renew',     label:'Em renovação',    hint:'< 60 dias para o fim'},
  {k:'pending',   label:'Pendente',        hint:'A aguardar assinatura'},
  {k:'draft',     label:'Rascunho',        hint:'Admin a redigir'},
  {k:'ended',     label:'Terminado',       hint:'24 meses completos'},
  {k:'failed',    label:'Suspenso',        hint:'Falha de pagamento'},
];

const CYCLE_STATE_OPTIONS = [
  {k:'awaiting', label:'Extras pendentes'},
  {k:'confirmed',label:'Confirmados'},
  {k:'charging', label:'A cobrar'},
  {k:'charged',  label:'Cobrado'},
  {k:'failed',   label:'Falhou'},
  {k:'invoiced', label:'Faturado'},
  {k:'dispatch', label:'Despachado'},
  {k:'delivered',label:'Entregue'},
];

// Quarterly dates for ciclo 1..8 (a sample contract starting Set 2024)
const QUARTERS = [
  {q:1, label:'Q1',  date:'DEZ 2024'},
  {q:2, label:'Q2',  date:'MAR 2025'},
  {q:3, label:'Q3',  date:'JUN 2025'},
  {q:4, label:'Q4',  date:'SET 2025'},
  {q:5, label:'Q5',  date:'DEZ 2025'},
  {q:6, label:'Q6',  date:'MAR 2026'},
  {q:7, label:'Q7',  date:'JUN 2026'},
  {q:8, label:'Q8',  date:'SET 2026'},
];

// Contracts (linked to customers by id)
const CRM_CONTRACTS = [
  {id:'HTL-26-0142', state:'active', current:3, value:3842.00,  nextDate:'15.09.2026', endDate:'13.09.2026', startDate:'14.09.2024', cycleState:'awaiting',  base:[['CDR-SHM-5L',10],['BGP-SBL-5L',6],['SLT-LOC-1L',30],['SLT-SBR-12',240],['LNH-TLR-46',80]]},
  {id:'SPA-26-0091', state:'active', current:5, value:1280.00,  nextDate:'22.09.2026', endDate:'21.09.2027', startDate:'22.06.2025', cycleState:'confirmed', base:[['SLT-LOC-1L',24],['SLT-SBR-12',180],['LNH-TLR-46',40]]},
  {id:'GYM-26-0073', state:'renew',  current:7, value:920.00,   nextDate:'01.10.2026', endDate:'30.11.2026', startDate:'01.12.2024', cycleState:'charged',   base:[['SLT-LOC-1L',12],['SLT-SBR-12',60]]},
  {id:'BRB-26-0058', state:'active', current:2, value:620.00,   nextDate:'03.10.2026', endDate:'02.07.2027', startDate:'03.04.2026', cycleState:'awaiting',  base:[['CDR-OLB-30',12],['BGP-PCB-10',8]]},
  {id:'HTL-25-0021', state:'renew',  current:8, value:4110.00,  nextDate:'30.10.2026', endDate:'29.12.2026', startDate:'30.12.2024', cycleState:'invoiced',  base:[['CDR-SHM-5L',12],['SLT-SBR-12',300],['LNH-TLR-46',120],['ALG-RPN-ML',40]]},
  {id:'SPA-26-0044', state:'pending',current:0, value:2240.00,  nextDate:'12.11.2026', endDate:'11.11.2028', startDate:'12.11.2026', cycleState:'awaiting',  base:[['SLT-LOC-1L',40],['SLT-SBR-12',200]]},
  {id:'HTL-26-0166', state:'active', current:4, value:5680.00,  nextDate:'18.09.2026', endDate:'17.03.2027', startDate:'18.09.2024', cycleState:'dispatch',  base:[['CDR-SHM-5L',16],['SLT-LOC-1L',48],['LNH-TLR-46',200]]},
  {id:'GYM-26-0102', state:'active', current:3, value:480.00,   nextDate:'08.10.2026', endDate:'07.04.2028', startDate:'08.10.2024', cycleState:'awaiting',  base:[['SLT-SBR-12',40],['SLT-LOC-1L',6]]},
  {id:'BRB-26-0079', state:'active', current:6, value:780.00,   nextDate:'15.10.2026', endDate:'14.10.2026', startDate:'15.04.2025', cycleState:'confirmed', base:[['CDR-OLB-30',16],['BGP-PCB-10',12]]},
  {id:'HTL-26-0151', state:'active', current:5, value:3120.00,  nextDate:'20.09.2026', endDate:'19.03.2027', startDate:'20.09.2024', cycleState:'charged',   base:[['CDR-SHM-5L',8],['BGP-SBL-5L',6],['SLT-SBR-12',180]]},
  {id:'SPA-25-0019', state:'ended',  current:8, value:1480.00,  nextDate:'—',          endDate:'10.05.2026', startDate:'10.05.2024', cycleState:'delivered', base:[['SLT-LOC-1L',20],['SLT-SBR-12',120]]},
  {id:'GYM-26-0118', state:'active', current:2, value:380.00,   nextDate:'25.10.2026', endDate:'24.07.2028', startDate:'25.07.2026', cycleState:'awaiting',  base:[['SLT-SBR-12',32]]},
  {id:'BRB-26-0092', state:'active', current:4, value:540.00,   nextDate:'12.10.2026', endDate:'11.04.2027', startDate:'12.10.2024', cycleState:'failed',    base:[['CDR-OLB-30',10],['BGP-PCB-10',6]]},
  {id:'HTL-26-0177', state:'draft',  current:0, value:6280.00,  nextDate:'—',          endDate:'—',          startDate:'—',          cycleState:'awaiting',  base:[]},
  {id:'SPA-26-0061', state:'active', current:1, value:1640.00,  nextDate:'05.11.2026', endDate:'04.08.2028', startDate:'05.08.2026', cycleState:'confirmed', base:[['SLT-LOC-1L',32],['SLT-SBR-12',140]]},
  {id:'HTL-26-0188', state:'pending',current:0, value:2880.00,  nextDate:'30.11.2026', endDate:'29.11.2028', startDate:'30.11.2026', cycleState:'awaiting',  base:[['CDR-SHM-5L',6],['SLT-SBR-12',160]]},
  {id:'GYM-26-0131', state:'active', current:6, value:1120.00,  nextDate:'28.09.2026', endDate:'27.03.2027', startDate:'28.09.2024', cycleState:'dispatch',  base:[['SLT-LOC-1L',16],['SLT-SBR-12',80]]},
  {id:'BRB-26-0114', state:'failed', current:3, value:480.00,   nextDate:'18.09.2026', endDate:'17.06.2027', startDate:'18.06.2025', cycleState:'failed',    base:[['CDR-OLB-30',8],['BGP-PCB-10',6]]},
];

const CRM_FMT_EUR = (n) => n.toLocaleString('pt-PT', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' €';
const CRM_FMT_NUM = (n) => n.toLocaleString('pt-PT');

// Customer lookup
const CRM_BY_ID = Object.fromEntries(CRM_CUSTOMERS.map(c => [c.id, c]));

// Aggregates
const CRM_MRR = CRM_CONTRACTS.filter(c => c.state==='active' || c.state==='renew').reduce((s,c) => s + c.value, 0);
const CRM_NEXT_30 = CRM_CONTRACTS.filter(c => c.state==='active' || c.state==='renew').slice(0,8);
const CRM_PENDING_EXTRAS = CRM_CONTRACTS.filter(c => c.cycleState === 'awaiting' && (c.state==='active' || c.state==='renew'));
const CRM_RENEWING = CRM_CONTRACTS.filter(c => c.state === 'renew');
const CRM_FAILED = CRM_CONTRACTS.filter(c => c.cycleState === 'failed' || c.state === 'failed');

// Activity feed (most recent events)
const CRM_ACTIVITY = [
  {when:'há 12 min', who:'sistema',   what:'Fatura emitida',      ref:'HTL-26-0142', detail:'TOConline OK · F2026/0431'},
  {when:'há 38 min', who:'Jorge L.',  what:'Contrato renovado',   ref:'HTL-25-0021', detail:'+24 meses · termos mantidos'},
  {when:'há 1 h',    who:'sistema',   what:'Cobrança falhou',     ref:'BRB-26-0114', detail:'IBAN sem provisão · retry 24h'},
  {when:'há 2 h',    who:'sistema',   what:'Mandato SEPA assinado',ref:'HTL-26-0151', detail:'Stripe · validation OK'},
  {when:'há 3 h',    who:'sistema',   what:'Extras confirmados',  ref:'SPA-26-0091', detail:'+2 SKUs · +180 €'},
  {when:'ontem',     who:'Jorge L.',  what:'Cliente criado',      ref:'HTL-26-0177', detail:'Quinta da Pousa · draft'},
  {when:'ontem',     who:'sistema',   what:'Entrega despachada',  ref:'HTL-26-0166', detail:'CTT Expresso · 8 caixas'},
  {when:'2 dias',    who:'sistema',   what:'D-7 · lembrete enviado',ref:'GYM-26-0102',detail:'Extras pendentes'},
];

Object.assign(window, {
  CRM_CUSTOMERS, CRM_PRODUCTS, CRM_CONTRACTS,
  STATE_OPTIONS, CYCLE_STATE_OPTIONS, QUARTERS,
  CRM_FMT_EUR, CRM_FMT_NUM, CRM_BY_ID,
  CRM_MRR, CRM_NEXT_30, CRM_PENDING_EXTRAS, CRM_RENEWING, CRM_FAILED, CRM_ACTIVITY,
});
