// calc.jsx — Berechnungen für deutsche Anlageimmobilien
// AfA, Cashflow, Annuität, Nebenkosten, Renditen.

// ============ AfA-Profile ============
// Each: { label, schedule: (gebaeudewert, jahre) -> array of {jahr, satz, betrag} }

const AFA_PROFILE = {
  'linear-2':    { label: 'Linear 2 % (Bestand, ab 1925)',         beschreibung: '50 Jahre, jährlich 2 %',         erste: 50, satzFix: 0.02, neubau: false },
  'linear-2.5':  { label: 'Linear 2,5 % (Bestand, vor 1925)',      beschreibung: '40 Jahre, jährlich 2,5 %',       erste: 40, satzFix: 0.025, neubau: false },
  'linear-3':    { label: 'Linear 3 % (Neubau ab 2023)',           beschreibung: '33 Jahre, jährlich 3 %',         erste: 34, satzFix: 0.03, neubau: true },
  'degressiv-5': { label: 'Degressive AfA 5 % (Neubau)',           beschreibung: 'Erste 6 Jahre 5 % vom Restwert, dann linear 3 %', erste: 50, neubau: true },
  'sonder-7b':   { label: 'Sonder-AfA §7b (Mietwohnungsneubau)',   beschreibung: '5 % zusätzlich Jahre 1–4, danach linear', erste: 50, neubau: true },
  'denkmal-7i':  { label: 'Denkmal-AfA §7i',                       beschreibung: 'Sanierungskosten: 9 % Jahre 1–8, 7 % Jahre 9–12 + lineare AfA auf Altsubstanz', erste: 50, neubau: false },
  'restnd':      { label: 'Verkürzte Restnutzungsdauer (Gutachten)', beschreibung: 'Individuelle Restnutzungsdauer (Gutachterverfahren)', erste: 25, neubau: false },
};

function afaSchedule({ profil, gebaeudewert, sanierungskosten = 0, restNd = 25, jahre = 12 }) {
  const out = [];
  switch (profil) {
    case 'linear-2':   { for (let j=1;j<=jahre;j++) out.push({ jahr:j, satz:0.02, betrag: gebaeudewert*0.02 }); break; }
    case 'linear-2.5': { for (let j=1;j<=jahre;j++) out.push({ jahr:j, satz:0.025, betrag: gebaeudewert*0.025 }); break; }
    case 'linear-3':   { for (let j=1;j<=jahre;j++) out.push({ jahr:j, satz:0.03, betrag: gebaeudewert*0.03 }); break; }
    case 'degressiv-5': {
      // §7 Abs. 5a EStG (vereinfacht): 5 % vom Restwert in den ersten 6 Jahren,
      // danach linear 3 % auf den dann verbleibenden Restwert.
      let rest = gebaeudewert;
      for (let j=1; j<=jahre; j++) {
        if (j <= 6) {
          const b = rest * 0.05; out.push({ jahr:j, satz:0.05, betrag:b }); rest -= b;
        } else {
          const b = gebaeudewert * 0.03; // konservativ
          out.push({ jahr:j, satz:0.03, betrag: Math.min(b, rest) }); rest -= b;
        }
      }
      break;
    }
    case 'sonder-7b': {
      // Lineare AfA (3 % Neubau) + Sonder-AfA 5 % in Jahren 1–4
      for (let j=1;j<=jahre;j++) {
        const linear = gebaeudewert * 0.03;
        const sonder = j <= 4 ? gebaeudewert * 0.05 : 0;
        out.push({ jahr:j, satz: 0.03 + (j<=4?0.05:0), betrag: linear + sonder, linear, sonder });
      }
      break;
    }
    case 'denkmal-7i': {
      // Linear 2 % auf Altsubstanz (Gebäudewert) + Sanierungs-AfA: 9 % J1-8, 7 % J9-12.
      for (let j=1;j<=jahre;j++) {
        const linear = gebaeudewert * 0.02;
        let san = 0;
        if (j <= 8)        san = sanierungskosten * 0.09;
        else if (j <= 12)  san = sanierungskosten * 0.07;
        out.push({ jahr:j, satz: linear/(gebaeudewert+sanierungskosten) + san/(gebaeudewert+sanierungskosten), betrag: linear+san, linear, sonder: san });
      }
      break;
    }
    case 'restnd': {
      const satz = 1/restNd;
      for (let j=1;j<=jahre;j++) out.push({ jahr:j, satz, betrag: gebaeudewert*satz });
      break;
    }
    default:
      for (let j=1;j<=jahre;j++) out.push({ jahr:j, satz:0.02, betrag: gebaeudewert*0.02 });
  }
  return out;
}

// ============ Kaufnebenkosten ============
// Grunderwerbsteuersätze nach Bundesland (Stand 2024/25, vereinfacht).
const GRESt_BL = {
  'BW': 5.0, 'BY': 3.5, 'BE': 6.0, 'BB': 6.5, 'HB': 5.0, 'HH': 5.5,
  'HE': 6.0, 'MV': 6.0, 'NI': 5.0, 'NW': 6.5, 'RP': 5.0, 'SL': 6.5,
  'SN': 5.5, 'ST': 5.0, 'SH': 6.5, 'TH': 5.0,
};
const BL_LABEL = {
  'BW': 'Baden-Württemberg', 'BY': 'Bayern', 'BE': 'Berlin', 'BB': 'Brandenburg',
  'HB': 'Bremen', 'HH': 'Hamburg', 'HE': 'Hessen', 'MV': 'Mecklenburg-Vorp.',
  'NI': 'Niedersachsen', 'NW': 'Nordrhein-Westfalen', 'RP': 'Rheinland-Pfalz',
  'SL': 'Saarland', 'SN': 'Sachsen', 'ST': 'Sachsen-Anhalt', 'SH': 'Schleswig-Holstein',
  'TH': 'Thüringen',
};

function nebenkosten({ kaufpreis, bundesland = 'NW', notarPct = 1.5, maklerPct = 3.57 }) {
  const grEStPct = GRESt_BL[bundesland] ?? 6.0;
  const grESt = kaufpreis * grEStPct/100;
  const notar = kaufpreis * notarPct/100;
  const makler = kaufpreis * maklerPct/100;
  const summe = grESt + notar + makler;
  return { grEStPct, grESt, notarPct, notar, maklerPct, makler, summe };
}

// ============ Annuitätendarlehen ============
function annuitaet({ darlehen, zinsPct, tilgungPct }) {
  const zJ = darlehen * zinsPct/100;
  const tJ = darlehen * tilgungPct/100;
  const annuJ = zJ + tJ;
  return { jahr: annuJ, monat: annuJ/12, zins: zJ, tilgung: tJ };
}

function tilgungsplan({ darlehen, zinsPct, tilgungPct, jahre = 10 }) {
  let rest = darlehen;
  const z = zinsPct/100;
  const annu = darlehen * (z + tilgungPct/100);
  const out = [];
  for (let j = 1; j <= jahre; j++) {
    const zinsen = rest * z;
    const tilgung = Math.min(annu - zinsen, rest);
    rest -= tilgung;
    out.push({ jahr: j, zinsen, tilgung, annu: zinsen + tilgung, restschuld: Math.max(0, rest) });
    if (rest <= 0) break;
  }
  return out;
}

// ============ Cashflow vor & nach Steuer ============
function cashflow({
  kaufpreis, gebaeudewertPct = 0.8, sanierungskosten = 0, afaTyp = 'linear-2', restNd = 25,
  miete, // Monatsmiete kalt
  bewirtschaftung = 0, // monatl. nicht-umlagefähige Kosten
  ek, // Eigenkapital inkl. Nebenkosten
  zinsPct = 3.8, tilgungPct = 2.0,
  steuersatz = 0.42, // Grenzsteuersatz
  bundesland = 'NW', notarPct = 1.5, maklerPct = 3.57,
}) {
  const nk = nebenkosten({ kaufpreis, bundesland, notarPct, maklerPct });
  const gesamt = kaufpreis + nk.summe + sanierungskosten;
  const darlehen = Math.max(0, gesamt - ek);
  const ann = annuitaet({ darlehen, zinsPct, tilgungPct });

  // Jahr 1 vereinfacht: Zins voll, Tilgung über Annuität (ohne Tilgungsverlauf)
  const mieteJ = miete * 12;
  const bewirtJ = bewirtschaftung * 12;
  const zinsJ = darlehen * zinsPct/100;
  const tilgungJ = ann.jahr - zinsJ;

  const gebaeudewert = kaufpreis * gebaeudewertPct;
  const afa1 = afaSchedule({ profil: afaTyp, gebaeudewert, sanierungskosten, restNd, jahre: 1 })[0]?.betrag || 0;

  // Steuerliches Ergebnis: Miete - Bewirtschaftung - Zinsen - AfA (Tilgung NICHT abziehbar)
  const steuerErgebnis = mieteJ - bewirtJ - zinsJ - afa1;
  const steuerWirkung = steuerErgebnis * steuersatz; // negativ = Ersparnis

  // Cashflow vor Steuer: Miete - Bewirtschaftung - Annuität (Zins + Tilgung)
  const cfVor = mieteJ - bewirtJ - ann.jahr;
  // Cashflow nach Steuer: vor Steuer - Steuerwirkung
  const cfNach = cfVor - steuerWirkung;

  // Renditen
  const bruttoMietrendite = mieteJ / kaufpreis;
  const nettoMietrendite = (mieteJ - bewirtJ) / gesamt;
  const ekRendite = ek > 0 ? cfNach / ek : 0;

  return {
    nebenkosten: nk, gesamt, darlehen, annuitaet: ann,
    mieteJ, bewirtJ, zinsJ, tilgungJ, afa1, gebaeudewert,
    steuerErgebnis, steuerWirkung, ersparnis: -steuerWirkung,
    cfVor, cfNach, cfMonatVor: cfVor/12, cfMonatNach: cfNach/12,
    bruttoMietrendite, nettoMietrendite, ekRendite,
  };
}

window.AFA_PROFILE = AFA_PROFILE;
window.GRESt_BL = GRESt_BL;
window.BL_LABEL = BL_LABEL;
window.afaSchedule = afaSchedule;
window.nebenkosten = nebenkosten;
window.annuitaet = annuitaet;
window.tilgungsplan = tilgungsplan;
window.cashflow = cashflow;
