#!/usr/bin/python

import argparse
import sys
from datetime import datetime

from qrbill import QRBill

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--output',
                        help='output file')
    parser.add_argument('--account', required=True,
                        help='creditor IBAN account number')
    parser.add_argument('--creditor-name', required=True,
                        help='creditor name')
    parser.add_argument('--creditor-street',
                        help='creditor street')
    parser.add_argument('--creditor-housenumber',
                        help='creditor house number')
    parser.add_argument('--creditor-postalcode', required=True,
                        help='creditor postal code')
    parser.add_argument('--creditor-city', required=True,
                        help='creditor city')
    parser.add_argument('--creditor-country', default='CH',
                        help='creditor country')
    parser.add_argument('--ucreditor-name',
                        help='ulitmate creditor name')
    parser.add_argument('--ucreditor-street',
                        help='ultimate creditor street')
    parser.add_argument('--ucreditor-housenumber',
                        help='ultimate creditor house number')
    parser.add_argument('--ucreditor-postalcode',
                        help='ultimate creditor postal code')
    parser.add_argument('--ucreditor-city',
                        help='ultimate creditor city')
    parser.add_argument('--ucreditor-country', default='CH',
                        help='ultimate creditor country')
    parser.add_argument('--amount',
                        help='amount of payment')
    # only CHF and EUR are acceptable
    # see https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf
    # chapter 4.3.3 elemet Ccy
    parser.add_argument('--currency', default='CHF', choices=['CHF', 'EUR'],
                        help='currency of payment')
    parser.add_argument('--due-date',
                        help='due date of payment in the form YYYY-MM-DD')
    parser.add_argument('--debtor-name',
                        help='debtor name')
    parser.add_argument('--debtor-street',
                        help='debtor street')
    parser.add_argument('--debtor-housenumber',
                        help='debtor house number')
    parser.add_argument('--debtor-postalcode',
                        help='debtor postal code')
    parser.add_argument('--debtor-city',
                        help='debtor city')
    parser.add_argument('--debtor-country', default='CH',
                        help='debtor country')
    parser.add_argument('--reference-number',
                        help='reference number')
    parser.add_argument('--extra-infos',
                        help='payment purpose')
    # see https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf
    # annex D table 16
    parser.add_argument('--language', default='en', choices=['en', 'de', 'fr', 'it'],
                        help='language')

    args = parser.parse_args()
    creditor = {
        'name': args.creditor_name, 'street': args.creditor_street,
        'house_num': args.creditor_housenumber, 'pcode': args.creditor_postalcode,
        'city': args.creditor_city, 'country': args.creditor_country,
    } if args.creditor_name else None
    final_creditor = {
        'name': args.ucreditor_name, 'street': args.ucreditor_street,
        'house_num': args.ucreditor_housenumber, 'pcode': args.ucreditor_postalcode,
        'city': args.ucreditor_city, 'country': args.ucreditor_country,
    } if args.ucreditor_name else None
    debtor = {
        'name': args.debtor_name, 'street': args.debtor_street,
        'house_num': args.debtor_housenumber, 'pcode': args.debtor_postalcode,
        'city': args.debtor_city, 'country': args.debtor_country,
    } if args.debtor_name else None

    if args.output and not args.output.endswith('.svg'):
        sys.exit("Error: The output file name should end with .svg")

    try:
        bill = QRBill(
            account=args.account,
            creditor=creditor,
            final_creditor=final_creditor,
            amount=args.amount,
            currency=args.currency,
            due_date=args.due_date,
            debtor=debtor,
            ref_number=args.reference_number,
            extra_infos=args.extra_infos,
            language=args.language,
        )
    except ValueError as err:
        sys.exit("Error: %s" % err)

    if args.output:
        out_path = args.output
    else:
        out_path = "{}-{}.svg".format(
            args.account.replace(' ', ''),
            datetime.now().strftime("%Y-%m-%d_%H%M%S")
        )
    bill.as_svg(out_path)
