namespace FKGees.DocsDefinitions.Registers;

public class Fa : IRegistersDefinition
{
    public string Type => nameof(Fa).ToUpper();
    public int[] DocTypes => [33];
    
    private readonly Context _context;

    public Fa(Context context)
    {
        _context = context;
    }

    public Task<List<RegistersResult>> Process(IReadOnlyList<Dok> documents)
    {
        var result = new List<RegistersResult>();

        var docs = documents.Where(x => DocTypes.Contains(x.TypDok));

        foreach (var dok in docs)
        {
            var item = dok.RegisterKontr();
            item.symbolmag = _context.SymbolMag;
            item.rodzaj = Type;
            item.nr = dok.NrDok;
            item.dwystawienia = dok.DataDod;
            item.dsprzedazy = dok.DataPom;
            item.dwplywu = dok.Data;
            item.OpisDok = dok.NrDok;
            item.platnosc = _context.PaymentForms.FirstOrDefault(x => x.FormaPlat == dok.FormaPlat)?.Tekst ?? string.Empty;
            item.kredyt = (-(dok.DoZaplaty - dok.Zaplacono)).AsString();
            item.termin = dok.DataDod.AddDays(dok.TerminPlat);
            
            item.sn23 = (dok.Rozbicie(2300)?.Netto ?? 0).AsString();
            item.sn22 = (dok.Rozbicie(2200)?.Netto ?? 0).AsString();
            item.sn8 = (dok.Rozbicie(800)?.Netto ?? 0).AsString();
            item.sn7 = (dok.Rozbicie(700)?.Netto ?? 0).AsString();
            item.sn5 = (dok.Rozbicie(500)?.Netto ?? 0).AsString();
            item.sn3 = (dok.Rozbicie(300)?.Netto ?? 0).AsString();
            item.sn0 = (dok.Rozbicie(0)?.Netto ?? 0).AsString();
            item.snzw = (dok.Rozbicie(-1)?.Netto ?? 0).AsString();
            item.snr = dok.RozbicieDok.Sum(x => x.Netto).AsString();
            
            item.sv23 = (dok.Rozbicie(2300)?.Podatek ?? 0).AsString();
            item.sv22 = (dok.Rozbicie(2200)?.Podatek ?? 0).AsString();
            item.sv8 = (dok.Rozbicie(800)?.Podatek ?? 0).AsString();
            item.sv7 = (dok.Rozbicie(700)?.Podatek ?? 0).AsString();
            item.sv5 = (dok.Rozbicie(500)?.Podatek ?? 0).AsString();
            item.sv3 = (dok.Rozbicie(300)?.Podatek ?? 0).AsString();
            item.svr = dok.RozbicieDok.Sum(x => x.Podatek).AsString();
            
            item.sb23 = ((dok.Rozbicie(2300)?.Netto ?? 0) + (dok.Rozbicie(2300)?.Podatek ?? 0)).AsString();
            item.sb22 = ((dok.Rozbicie(2200)?.Netto ?? 0) + (dok.Rozbicie(2200)?.Podatek ?? 0)).AsString();
            item.sb8 = ((dok.Rozbicie(800)?.Netto ?? 0) + (dok.Rozbicie(800)?.Podatek ?? 0)).AsString();
            item.sb7 = ((dok.Rozbicie(700)?.Netto ?? 0) + (dok.Rozbicie(700)?.Podatek ?? 0)).AsString();
            item.sb5 = ((dok.Rozbicie(500)?.Netto ?? 0) + (dok.Rozbicie(500)?.Podatek ?? 0)).AsString();
            item.sb3 = ((dok.Rozbicie(300)?.Netto ?? 0) + (dok.Rozbicie(300)?.Podatek ?? 0)).AsString();
            item.sbr = dok.RozbicieDok.Sum(x => x.Podatek + x.Netto).AsString();
            
            item.zn23 = (dok.Rozbicie(2300)?.NettoMag ?? 0).AsString();
            item.zn22 = (dok.Rozbicie(2200)?.NettoMag ?? 0).AsString();
            item.zn8 = (dok.Rozbicie(800)?.NettoMag ?? 0).AsString();
            item.zn7 = (dok.Rozbicie(700)?.NettoMag ?? 0).AsString();
            item.zn5 = (dok.Rozbicie(500)?.NettoMag ?? 0).AsString();
            item.zn3 = (dok.Rozbicie(300)?.NettoMag ?? 0).AsString();
            item.zn0 = (dok.Rozbicie(0)?.NettoMag ?? 0).AsString();
            item.znzw = (dok.Rozbicie(-1)?.NettoMag ?? 0).AsString();
            item.znr = dok.RozbicieDok.Sum(x => x.NettoMag ?? 0).AsString();
            
            item.zv23 = (dok.Rozbicie(2300)?.PodatekMag ?? 0).AsString();
            item.zv22 = (dok.Rozbicie(2200)?.PodatekMag ?? 0).AsString();
            item.zv8 = (dok.Rozbicie(800)?.PodatekMag ?? 0).AsString();
            item.zv7 = (dok.Rozbicie(700)?.PodatekMag ?? 0).AsString();
            item.zv5 = (dok.Rozbicie(500)?.PodatekMag ?? 0).AsString();
            item.zv3 = (dok.Rozbicie(300)?.PodatekMag ?? 0).AsString();
            item.znr = dok.RozbicieDok.Sum(x => x.PodatekMag ?? 0).AsString();
            
            item.zb23 = ((dok.Rozbicie(2300)?.NettoMag ?? 0) + (dok.Rozbicie(2300)?.PodatekMag ?? 0)).AsString();
            item.zb22 = ((dok.Rozbicie(2200)?.NettoMag ?? 0) + (dok.Rozbicie(2200)?.PodatekMag ?? 0)).AsString();
            item.zb8 = ((dok.Rozbicie(800)?.NettoMag ?? 0) + (dok.Rozbicie(800)?.PodatekMag ?? 0)).AsString();
            item.zb7 = ((dok.Rozbicie(700)?.NettoMag ?? 0) + (dok.Rozbicie(700)?.PodatekMag ?? 0)).AsString();
            item.zb5 = ((dok.Rozbicie(500)?.NettoMag ?? 0) + (dok.Rozbicie(500)?.PodatekMag ?? 0)).AsString();
            item.zb3 = ((dok.Rozbicie(300)?.NettoMag ?? 0) + (dok.Rozbicie(300)?.PodatekMag ?? 0)).AsString();
            item.zbr = dok.RozbicieDok.Sum(x => x.PodatekMag ?? 0 + x.NettoMag ?? 0).AsString();
            
            result.Add(item);
        }
        
        return Task.FromResult(result);
    }
}