#!/usr/local/bin/python
"""original script from https://github.com/MatzeB/pygnucash/blob/master/gnucash2ledger.py by Matthias Braun matze@braunis.de
 adapted for:
 - python 3 support
 - new string formatting

The security must exist in GnuCash database.
Example of a valid CSV file:
    currency,commodity,value,date
    AUD,YMAX,9.06,"2017-11-10"
 
"""
import argparse
import csv
from datetime import datetime
from decimal import Decimal
import sys
import codecs
from piecash import Price

import piecash

if sys.version_info.major == 2:
    out = codecs.getwriter('UTF-8')(sys.stdout)
else:
    out = sys.stdout

parser = argparse.ArgumentParser(description="""
Import and export prices to and from a gnucash book.

Per default, it exports the full prices list from the gnucash book to the standard output in a CSV format.
To import, add the argument "--import file_to_import.csv".

The format used is a standard CSV (comma as separator) with the following columns:
 - date (YYYY-MM-DD)
 - commodity (gnucash mnemonic)
 - currency (gnucash mnemonic)
 - type (string, optional)
 - value (float)
 - type (string, optional)
""",formatter_class=argparse.RawTextHelpFormatter )
parser.add_argument("gnucash_filename",
                    help="the name of the gnucash file")
parser.add_argument("--import", dest="operation",
                    help="to import the prices from a csv file (default export)")
args = parser.parse_args()

# args.operation is the name of the import file (.csv).

if args.operation is None:
    # export the prices
    out.write("date,type,value,value_num, value_denom, currency,commodity,source\n")
    with piecash.open_book(args.gnucash_filename, open_if_lock=True) as book:
        out.writelines("{p.date:%Y-%m-%d},{p.type},{p.value},{p._value_num},{p._value_denom},{p.currency.mnemonic},{p.commodity.mnemonic},{p.source}\n".format(p=p) for p in book.prices)
else:
    # import the prices
    with piecash.open_book(args.gnucash_filename, open_if_lock=True, readonly=False) as book:
        cdty = book.commodities
        importFile = open(args.operation, 'r')
        
        for l in csv.DictReader(importFile):
            cur = cdty(mnemonic=l['currency'])
            com = cdty(mnemonic=l['commodity'])
            type = l.get('type',None)
            date = datetime.strptime(l['date'],"%Y-%m-%d")
            v = Decimal(l['value'])
            Price(currency=cur,
                  commodity=com,
                  date=date,
                  value=v,
                  source="piecash-importer")
        book.save()
