using System;
using System.Collections.Generic;
using System.Linq;
using PolyTrader.Modules.Accounting.Models;

namespace PolyTrader.Modules.Accounting.Logic
{
    /// <summary>
    /// Reine Währungsumrechnung (A-2): jede Transaktion/Aufstellung ist in USDC (nativ). USD ergibt sich
    /// über die (dokumentierte, umstellbare) USDC≈USD-Annahme; EUR über amtliche USD→EUR-Tageskurse
    /// (EZB, versioniert in acc_fx_rates). Seiteneffektfrei + unit-getestet.
    /// </summary>
    public static class FxConverter
    {
        /// <summary>Dokumentierte Vereinfachung: 1 USDC = 1 USD (im Export ausgewiesen, in Settings umstellbar).</summary>
        public const decimal DefaultUsdcToUsd = 1.0m;

        public static decimal UsdcToUsd(decimal usdc, decimal usdcToUsd) =>
            Math.Round(usdc * usdcToUsd, 6, MidpointRounding.AwayFromZero);

        public static decimal UsdToEur(decimal usd, decimal usdToEur) =>
            Math.Round(usd * usdToEur, 6, MidpointRounding.AwayFromZero);

        public static decimal UsdcToEur(decimal usdc, decimal usdToEur, decimal usdcToUsd) =>
            Math.Round(usdc * usdcToUsd * usdToEur, 6, MidpointRounding.AwayFromZero);

        /// <summary>
        /// Amtlicher Kurs am oder vor dem Stichtag (Wochenend-/Feiertagskurse gibt es nicht → letzter
        /// gültiger davor). null, wenn kein Kurs am/vor dem Datum vorliegt.
        /// </summary>
        public static FxRate? NearestOnOrBefore(IEnumerable<FxRate> rates, DateTime date)
        {
            DateTime day = date.Date;
            return rates.Where(r => r.Date.Date <= day)
                        .OrderByDescending(r => r.Date)
                        .FirstOrDefault();
        }
    }
}
