// FundData.jsx — sample data for Bulder Fond
// Prices in NOK, returns as decimal (0.12 = 12%)

const FUNDS = [
  {
    id: 'global',
    name: 'Bulder Global Indeks',
    short: 'Global',
    ticker: 'BULDG',
    tagline: 'Hele verdensmarkedet. Lav pris.',
    desc: 'Følger en bred global aksjeindeks med ca. 1 600 selskaper i 23 utviklede markeder. Ingen aktiv forvaltning.',
    risk: 6, // 1-7
    fee: 0.29, // %
    marketFee: 0.85,
    currency: 'NOK',
    color: '#0926D6',
    accent: '#4A5FE8',
    holdings: 1623,
    morningstar: 5,
    ytd: 0.094,
    perf: {
      '1M': 0.018, '3M': 0.043, 'YTD': 0.094, '1Å': 0.152, '5Å': 0.587, 'Alle': 1.34,
    },
    // History points — used for big chart. Seeds per period.
    series: {
      '1M': [100,100.4,100.1,99.8,100.6,101.2,101.0,101.4,101.7,101.5,101.8,101.6,102.0,101.8],
      '3M': [100,99.4,100.2,101.1,102.0,101.2,102.8,103.5,102.9,103.9,104.1,103.4,104.3],
      '1Å': [100,101.2,99.4,102.1,104.3,103.1,105.8,107.2,106.1,108.9,110.3,109.4,112.7,113.9,115.2],
      '5Å': [100,108,112,103,117,124,119,132,141,135,148,156,152,163,158],
      'Alle': [100,108,112,103,117,124,119,132,141,135,148,156,152,163,158,171,185,192,201,218,234],
    },
    sectors: [
      { name: 'Teknologi', pct: 0.24, color: '#0926D6' },
      { name: 'Finans', pct: 0.15, color: '#9361F8' },
      { name: 'Helse', pct: 0.12, color: '#85FF86' },
      { name: 'Industri', pct: 0.11, color: '#FFAD33' },
      { name: 'Forbruk', pct: 0.10, color: '#E04F90' },
      { name: 'Annet', pct: 0.28, color: '#3E4965' },
    ],
    top: [
      { name: 'Apple', pct: 4.2 },
      { name: 'Microsoft', pct: 3.9 },
      { name: 'Nvidia', pct: 3.6 },
      { name: 'Amazon', pct: 2.4 },
      { name: 'Alphabet', pct: 2.1 },
    ],
    owned: { shares: 847.214, valueNok: 98450, costNok: 84200 },
  },
  {
    id: 'norge',
    name: 'Bulder Norge Indeks',
    short: 'Norge',
    ticker: 'BULDN',
    tagline: 'Oslo Børs. Norsk næringsliv.',
    desc: 'Følger OSEBX — de største og mest omsatte selskapene på Oslo Børs.',
    risk: 6,
    fee: 0.19,
    marketFee: 0.72,
    currency: 'NOK',
    color: '#FE4D5B',
    accent: '#FF8088',
    holdings: 68,
    morningstar: 4,
    ytd: 0.112,
    perf: {
      '1M': 0.023, '3M': 0.061, 'YTD': 0.112, '1Å': 0.189, '5Å': 0.724, 'Alle': 1.62,
    },
    series: {
      '1M': [100,100.8,101.2,100.9,101.4,102.1,101.8,102.3,101.9,102.4,102.8,102.3,102.9,102.3],
      '3M': [100,101.1,102.3,101.4,103.8,105.2,104.1,105.9,106.4,105.8,106.9,107.4,106.1],
      '1Å': [100,102,104,101,106,108,105,111,114,110,116,119,117,122,118.9],
      '5Å': [100,112,118,108,125,134,128,142,156,148,162,171,168,178,172.4],
      'Alle': [100,112,118,108,125,134,128,142,156,148,162,171,168,178,172,189,204,218,235,251,262],
    },
    sectors: [
      { name: 'Energi', pct: 0.34, color: '#FFAD33' },
      { name: 'Finans', pct: 0.22, color: '#9361F8' },
      { name: 'Sjømat', pct: 0.14, color: '#85FF86' },
      { name: 'Industri', pct: 0.12, color: '#0926D6' },
      { name: 'Annet', pct: 0.18, color: '#3E4965' },
    ],
    top: [
      { name: 'Equinor', pct: 11.2 },
      { name: 'DNB', pct: 9.4 },
      { name: 'Mowi', pct: 6.1 },
      { name: 'Aker BP', pct: 4.8 },
      { name: 'Telenor', pct: 3.9 },
    ],
    owned: { shares: 312.51, valueNok: 41200, costNok: 35800 },
  },
  {
    id: 'barekraft',
    name: 'Bulder Bærekraft',
    short: 'Bærekraft',
    ticker: 'BULDB',
    tagline: 'Global indeks — strenge ESG-krav.',
    desc: 'Følger MSCI World ESG Leaders. Utelukker fossilt brensel, tobakk og våpen.',
    risk: 6,
    fee: 0.34,
    marketFee: 1.20,
    currency: 'NOK',
    color: '#85FF86',
    accent: '#61D562',
    holdings: 394,
    morningstar: 4,
    ytd: 0.081,
    perf: {
      '1M': 0.012, '3M': 0.031, 'YTD': 0.081, '1Å': 0.134, '5Å': 0.512, 'Alle': 0.98,
    },
    series: {
      '1M': [100,100.2,99.8,100.4,100.1,100.8,101.0,100.6,101.1,100.9,101.3,101.1,101.4,101.2],
      '3M': [100,99.8,100.6,101.2,100.4,102.0,102.8,101.9,102.6,103.0,102.8,103.3,103.1],
      '1Å': [100,101,99,102,104,102,106,108,105,110,112,110,113,114,113.4],
      '5Å': [100,109,113,105,119,126,122,134,142,138,149,154,151,158,151.2],
      'Alle': [100,109,113,105,119,126,122,134,142,138,149,154,151,158,151,165,172,178,186,192,198],
    },
    sectors: [
      { name: 'Teknologi', pct: 0.28, color: '#0926D6' },
      { name: 'Helse', pct: 0.18, color: '#85FF86' },
      { name: 'Finans', pct: 0.16, color: '#9361F8' },
      { name: 'Industri', pct: 0.10, color: '#FFAD33' },
      { name: 'Annet', pct: 0.28, color: '#3E4965' },
    ],
    top: [
      { name: 'Microsoft', pct: 5.1 },
      { name: 'Nvidia', pct: 4.2 },
      { name: 'Tesla', pct: 2.8 },
      { name: 'ASML', pct: 2.4 },
      { name: 'Novo Nordisk', pct: 2.2 },
    ],
    owned: null, // not yet owned
  },
];

const PERIODS = ['1M', '3M', 'YTD', '1Å', '5Å', 'Alle'];

// Portfolio owned funds (derived from FUNDS)
function getOwnedFunds() {
  return FUNDS.filter(f => f.owned);
}

function getTotalValue() {
  return getOwnedFunds().reduce((s, f) => s + f.owned.valueNok, 0);
}
function getTotalCost() {
  return getOwnedFunds().reduce((s, f) => s + f.owned.costNok, 0);
}
function getTotalGain() {
  return getTotalValue() - getTotalCost();
}
function getTotalGainPct() {
  return getTotalGain() / getTotalCost();
}

// Combine owned series into a portfolio series (weighted avg by cost)
function getPortfolioSeries(period) {
  const owned = getOwnedFunds();
  if (owned.length === 0) return [100];
  const cost = getTotalCost();
  const len = owned[0].series[period].length;
  const out = [];
  for (let i = 0; i < len; i++) {
    let v = 0;
    for (const f of owned) {
      v += (f.series[period][i] / 100) * (f.owned.costNok / cost);
    }
    out.push(v * 100);
  }
  return out;
}

// Format helpers
const fmtNok = (n, decimals = 0) => {
  const s = Math.round(Math.abs(n) * (10 ** decimals)) / (10 ** decimals);
  const parts = s.toString().split('.');
  // Use a visible gap (thin space) — rendered bigger via letter-spacing trick on spaces by callers; here emit a regular space which wraps better visually at large sizes.
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
  const sign = n < 0 ? '−' : '';
  return sign + parts.join(',');
};
const fmtPct = (n, decimals = 1) => {
  const sign = n > 0 ? '+' : (n < 0 ? '−' : '');
  return sign + Math.abs(n * 100).toFixed(decimals).replace('.', ',') + ' %';
};
const fmtPctNoSign = (n, decimals = 1) => Math.abs(n * 100).toFixed(decimals).replace('.', ',') + ' %';

Object.assign(window, {
  FUNDS, PERIODS,
  getOwnedFunds, getTotalValue, getTotalCost, getTotalGain, getTotalGainPct,
  getPortfolioSeries, fmtNok, fmtPct, fmtPctNoSign,
});
