#!/usr/bin/env python3
"""Własne scenariusze, nie harmonogram operatora. Python 3, bez zależności.

Uruchomienie: python3 finansowanie-ai-obliczenia.py
Zapisuje wyniki JSON i CSV obok skryptu. Założenia są jawne poniżej.
"""
import csv
import json
from decimal import Decimal, ROUND_HALF_UP
from pathlib import Path
from itertools import accumulate

D = Decimal
CENT = D("0.01")
OUT = Path(__file__).resolve().parent


def money(value):
    return str(value.quantize(CENT, rounding=ROUND_HALF_UP))


def calculate():
    principal, months, annual_rate = D("2700000"), 180, D("0.005")
    principal_payment = principal / months
    balance = principal
    rows = []
    for month in range(1, months + 1):
        interest = (balance * annual_rate / 12).quantize(CENT, rounding=ROUND_HALF_UP)
        payment = principal_payment + interest
        rows.append({"month": month, "opening_balance_pln": money(balance),
                     "principal_pln": money(principal_payment), "interest_pln": money(interest),
                     "payment_pln": money(payment), "closing_balance_pln": money(balance - principal_payment)})
        balance -= principal_payment
    interest_sum = sum(D(row["interest_pln"]) for row in rows)
    independent_interest = principal * annual_rate / 12 * D(months + 1) / 2
    assert balance == 0
    assert sum(D(row["principal_pln"]) for row in rows) == principal
    assert interest_sum == independent_interest
    operating = D("12000")
    first_total = D(rows[0]["payment_pln"]) + operating
    costs, revenue, grant = D("800000"), D("1500000"), D("400000")
    payments = [D("200000"), D("300000"), D("300000")]
    assert sum(payments) == costs
    assert grant == costs * D("0.5")
    assert grant <= revenue * D("0.3")
    result = {
        "scenario_date": "2026-10-11", "kind": "hypothetical_not_an_offer_or_measured_roi",
        "digit": {"eligible_costs_assumed_pln": money(costs), "payments_before_refund_pln": [money(p) for p in payments],
                  "cumulative_before_refund_pln": [money(p) for p in accumulate(payments)], "refund_assumed_pln": money(grant),
                  "net_cost_after_refund_pln": money(costs - grant), "revenue_limit_pln": money(revenue * D("0.3")),
                  "assumption": "EUR and de minimis caps do not reduce the assumed grant; VAT, ineligible costs and financing excluded"},
        "parp": {"principal_pln": money(principal), "months": months, "annual_rate": str(annual_rate),
                 "repayment_model": "equal principal monthly; interest on opening balance; no grace, fees or conditional grant",
                 "first_payment_pln": rows[0]["payment_pln"], "last_payment_pln": rows[-1]["payment_pln"],
                 "total_interest_pln": money(interest_sum), "total_repaid_pln": money(principal + interest_sum),
                 "operating_monthly_assumed_pln": money(operating), "first_month_outflow_pln": money(first_total),
                 "cash_benefit_assumed_pln": "30000.00", "cautious_cash_benefit_assumed_pln": "15000.00",
                 "first_month_surplus_pln": money(D("30000") - first_total),
                 "first_month_cautious_surplus_pln": money(D("15000") - first_total)}
    }
    return result, rows


if __name__ == "__main__":
    summary, schedule = calculate()
    (OUT / "finansowanie-ai-wyniki.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    with (OUT / "parp-pozyczka-scenariusz.csv").open("w", newline="", encoding="utf-8") as stream:
        writer = csv.DictWriter(stream, fieldnames=list(schedule[0]))
        writer.writeheader()
        writer.writerows(schedule)
    print(json.dumps(summary, ensure_ascii=False, indent=2))
