@using RazorLight
@inherits TemplatePage<Elwig.Documents.DeliveryConfirmation>
@model Elwig.Documents.DeliveryConfirmation
@{ Layout = "BusinessDocument"; }
<link rel="stylesheet" href="file:///@Raw(Model.DataPath)\resources\style-deliveryconfirmation.css"/>
<main>
    <h1>@Model.Title</h1>
    <table class="delivery-confirmation">
        <colgroup>
            <col style="width: 25mm;"/>
            <col style="width: 5mm;"/>
            <col style="width: 20mm;"/>
            <col style="width: 21mm;"/>
            <col style="width: 19mm;"/>
            <col style="width: 10mm;"/>
            <col style="width: 10mm;"/>
            <col style="width: 15mm;"/>
            <col style="width: 12mm;"/>
            <col style="width: 14mm;"/>
            <col style="width: 14mm;"/>
        </colgroup>
        <thead>
            <tr>
                <th rowspan="2" style="text-align: left;">Lieferschein-Nr.</th>
                <th rowspan="2">Pos.</th>
                <th rowspan="2" style="text-align: left;">Sorte</th>
                <th rowspan="2" style="text-align: left;">Attribut(e)</th>
                <th rowspan="2" style="text-align: left;">Qualitätsstufe</th>
                <th colspan="2">Gradation</th>
                <th colspan="2">Flächenbindung</th>
                <th>Gewicht</th>
                <th>Davon<br/>abzuwerten</th>
            </tr>
            <tr>
                <th>[°Oe]</th>
                <th>[°KMW]</th>
                <th colspan="2">[kg]</th>
                <th>[kg]</th>
                <th>[kg]</th>
            </tr>
        </thead>
        <tbody>
            @{
                var lastSortId = "";
            }
            @foreach (var p in Model.Deliveries) {
                var bins = p.Bins.Where(b => b.Value > 0).OrderByDescending(b => b.BinNr).ToArray();
                var rowsBins = bins.Length;
                var mods = p.Modifiers.Select(m => m.Name).ToArray();
                var rowsMod = mods.Length + 1;
                var rows = Math.Max(rowsBins, rowsMod);
                var first = true;
                @for (int i = 0; i < rows; i++) {
                    <tr class="@(first ? "first" : "") @(p.SortId != lastSortId && lastSortId != "" ? "new": "") @(rows > i + 1 ? "trailing" : "")">
                        @if (first) {
                            <td rowspan="@rows">@p.Delivery.LsNr</td>
                            <td rowspan="@rows">@p.DPNr</td>
                            <td class="small">@p.Variant.Name</td>
                            <td class="small">@p.AttributesString</td>
                            <td class="small">@p.Quality.Name</td>
                            <td rowspan="@rows" class="grad">@($"{p.Oe:N0}")</td>
                            <td rowspan="@rows" class="grad">@($"{p.Kmw:N1}")</td>
                        }
                        @if (i > 0 && i <= mods.Length) {
                            <td colspan="3" class="mod">@(mods[i - 1])</td>
                        } else if (i > 0) {
                            <td colspan="3"></td>
                        }
                        @if (i < bins.Length) {
                            var bin = bins[i];
                            <td class="geb">@(bin.Discr == "_" ? "ungeb." : $"geb. {p.SortId}{bin.Discr}"):</td>
                            <td class="weight">@($"{bin.Value:N0}")</td>
                        } else {
                            <td colspan="2"></td>
                        }
                        @if (i == bins.Length - 1) {
                            <td class="weight">@($"{p.Weight:N0}")</td>
                        } else {
                            <td></td>
                        }
                        @if (first) {
                            <td rowspan="@rows" class="weight"></td>
                            first = false;
                        }
                    </tr>
                    lastSortId = p.SortId;
                }
            }
            <tr class="sum">
                <td colspan="8">Gesamt:</td>
                <td colspan="2" class="weight">@($"{Model.Deliveries.Sum(p => p.Weight):N0}")</td>
                <td></td>
            </tr>
        </tbody>
    </table>
    <table class="delivery-confirmation-stats">
        <colgroup>
            <col style="width: 45mm;"/>
            <col style="width: 17mm;"/>
            <col style="width: 17mm;"/>
            <col style="width: 17mm;"/>
            <col style="width: 19mm;"/>
            <col style="width: 16mm;"/>
            <col style="width: 17mm;"/>
            <col style="width: 17mm;"/>
        </colgroup>
        <thead>
            <tr>
                <th><b>Lese @Model.Year</b> per @($"{Model.Date:dd.MM.yyyy}") [kg]</th>
                <th>Lieferpflicht</th>
                <th>Lieferrecht</th>
                <th>Unterliefert</th>
                <th>Noch lieferbar</th>
                <th>Überliefert</th>
                <th>Zugeteilt</th>
                <th>Geliefert</th>
            </tr>
        </thead>
        <tbody>
            @{
                string FormatRow(int mode, int obligation, int right, int sum, int? payment = null) {
                    var isGa = mode == 0;
                    payment ??= sum;
                    return $"<td>{(mode == 1 ? "" : obligation == 0 ? "-" : $"{obligation:N0}")}</td>" +
                        $"<td>{(mode == 1 ? "" : right == 0 ? "-" : $"{right:N0}")}</td>" +
                        $"<td>{(mode == 1 ? "" : payment < obligation ? $"<b>{obligation - payment:N0}\x3c/b>" : "-")}</td>" +
                        $"<td>{(mode == 1 ? "" : payment >= obligation && sum <= right ? $"{right - sum:N0}" : "-")}</td>" +
                        $"<td>{(mode == 1 ? "" : obligation == 0 && right == 0 ? "-" : (sum > right ? ((isGa ? "<b>" : "") + $"{sum - right:N0}" + (isGa ? "</b>" : "")) : "-"))}</td>" +
                        $"<td>{(mode != 2 ? "" : obligation == 0 && right == 0 ? "-" : $"{payment:N0}")}</td>" +
                        $"<td>{sum:N0}</td>";
                }
                var mBins = Model.MemberBins.Where(b => b.Value.Item2 > 0 || b.Value.Item3 > 0 || b.Value.Item4 > 0).ToList();
                var fbVars = mBins.Where(b => b.Value.Item2 > 0 || b.Value.Item3 > 0).Select(b => b.Key.Replace("_", "")).Order().ToArray();
                var fbs = mBins.Where(b => fbVars.Contains(b.Key)).OrderBy(b => b.Value.Item1);
                var rem = mBins.Where(b => !fbVars.Contains(b.Key)).OrderBy(b => b.Value.Item1);
            }
            <tr>
                <th>Gesamtlieferung lt. gez. GA</th>
                @Raw(FormatRow(0, Model.Member.DeliveryObligation, Model.Member.DeliveryRight, Model.Member.Deliveries.Where(d => d.Year == Model.Year).Sum(d => d.Weight)))
            </tr>
            @if (rem.Any()) {
                <tr class="subheading"><th colspan="8">Sortenaufteilung:</th></tr>
            }
            @foreach (var (id, (name, right, obligation, sum, payment)) in rem) {
                <tr>
                    <th>@name</th>
                    @Raw(FormatRow(1, obligation, right, sum, payment))
                </tr>
            }
            @if (fbs.Any()){
                <tr class="subheading"><th colspan="8">Flächenbindungen:</th></tr>
            }
            @foreach (var (id, (name, right, obligation, sum, payment)) in fbs) {
                <tr>
                    <th>@name</th>
                    @Raw(FormatRow(2, obligation, right, sum, payment))
                </tr>
            }
        </tbody>
    </table>
    <div class="text" style="margin-top: 2em;">
        @if (Model.Text != null) {
            <p class="comment" style="white-space: pre-wrap; break-inside: avoid;">@Model.Text</p>
        }
    </div>
</main>