from decimal import Decimal

def main(input):
    groups = {}
    for row in input:
        key = (row["invoice_id"], row["currency"])
        group = groups.setdefault(key, {"invoice": None, "paid": Decimal("0")})
        amount = Decimal(str(row["amount"]))
        if row["kind"] == "invoice":
            if group["invoice"] is not None:
                raise ValueError("Duplicate invoice key: " + str(key))
            group["invoice"] = amount
        elif row["kind"] == "payment":
            group["paid"] += amount
        else:
            raise ValueError("Unknown record kind: " + row["kind"])
    output = []
    for (invoice_id, currency), group in sorted(groups.items()):
        invoice, paid = group["invoice"], group["paid"]
        balance = invoice - paid if invoice is not None else None
        status = ("orphan_payment" if invoice is None else "matched" if balance == 0
            else "outstanding" if balance > 0 else "overpaid")
        output.append({"invoice_id": invoice_id, "currency": currency,
            "invoice_amount": float(invoice) if invoice is not None else "",
            "received_amount": float(paid), "balance": float(balance) if balance is not None else "",
            "reconciliation_status": status})
    return output
