using System;
namespace FrenchExDev.Net.State.Economy.Dsl;
///
/// Agrégat macroéconomique du SCN 2008 / SEC 2010. Les agrégats sont des
/// soldes comptables agrégés sur l'économie nationale : ils portent la même
/// unité (monnaie nominale) mais ont des domaines de variation distincts.
///
public interface IMacroAggregate
{
/// Code court SEC 2010 / SCN 2008.
string Code { get; }
}
/// PIB (B1*g) — somme des B1g + impôts nets sur les produits.
public sealed class GrossDomesticProduct : IMacroAggregate
{
public string Code => "B1*g";
public static readonly GrossDomesticProduct Instance = new();
private GrossDomesticProduct() { }
}
/// RNB (B5*g) — PIB + revenus primaires nets reçus du reste du monde.
public sealed class GrossNationalIncome : IMacroAggregate
{
public string Code => "B5*g";
public static readonly GrossNationalIncome Instance = new();
private GrossNationalIncome() { }
}
/// RDB (B6*g) — revenu national disponible brut.
public sealed class GrossDisposableIncome : IMacroAggregate
{
public string Code => "B6*g";
public static readonly GrossDisposableIncome Instance = new();
private GrossDisposableIncome() { }
}
/// FBCF (P51g) exprimée en agrégat national.
public sealed class GrossFixedCapitalFormation : IMacroAggregate
{
public string Code => "P51g";
public static readonly GrossFixedCapitalFormation Instance = new();
private GrossFixedCapitalFormation() { }
}
/// Épargne brute nationale (B8g) — RDB − dépense de consommation finale.
public sealed class GrossSaving : IMacroAggregate
{
public string Code => "B8g";
public static readonly GrossSaving Instance = new();
private GrossSaving() { }
}
///
/// Montant monétaire en euros, exprimé en milliards (unité standard INSEE /
/// Eurostat pour les comptes nationaux). Type-sûr : une confusion entre euros
/// et millions d'euros devient une erreur de compilation plutôt qu'un bug
/// silencieux dans un rapport budgétaire.
///
public readonly struct EurosBillions : IEquatable
{
public decimal Value { get; }
public EurosBillions(decimal value) { Value = value; }
public static EurosBillions Of(decimal value) => new(value);
public bool Equals(EurosBillions other) => Value == other.Value;
public override bool Equals(object? obj) => obj is EurosBillions other && Equals(other);
public override int GetHashCode() => Value.GetHashCode();
public override string ToString() => $"{Value:N1} Md€";
}