#!/usr/bin/env python
import os
import shutil
import codecs
import csv
import logging
import operator

__author__ = 'Holger Knust'

def check_for_dupes(in_file, out_file):
    header_read = False
    ean_index = -1
    qty_index = -1
    itm_index = -1
    var_index = -1
    nam_index = -1
    ean_dict = dict()
    dupes_found = False

    with codecs.open(in_file, "r", encoding='utf-8') as f, codecs.open(out_file, "w", encoding='utf-8') as of:
        dialect = csv.Sniffer().sniff(f.read(1024), delimiters=";,")
        f.seek(0)

        reader = csv.reader(f, dialect)
        writer = csv.writer(of, delimiter=';')
        for row in reader:
            if any(row):
                if header_read:
                    if row[ean_index] in ean_dict:
                        # Update the duplicate EAN by summing the quantities
                        #writer.writerow(row)
                        ean_dict[row[ean_index]]["Quantity"] += int(row[qty_index])
                    else:
                        col_pos = row[var_index].index(":")
                        ean_dict[row[ean_index]] = { "ItemNumber": str(row[itm_index])[2:].replace("_","-"), "ItemNumber_2": row[itm_index], "Quantity": int(row[qty_index])
                            ,"ItemName": row[nam_index], "VariationString": row[var_index][col_pos+1:], "ItemEAN1": row[ean_index] }
                else:
                    header_read = True
                    ean_index = row.index('ItemEAN1')
                    itm_index = row.index('ItemNumber')
                    nam_index = row.index('ItemName')
                    qty_index = row.index('Quantity')
                    var_index = row.index('VariationString')


        if len(ean_dict) > 0:
            # reshuffle the dict to prepare for sorting
            extkey_dict = dict()
            for key in ean_dict.keys():
                new_key = str(ean_dict[key]["ItemNumber"]) + str(key)
                extkey_dict[new_key] = ean_dict[key]

            new_row = ["ItemNumber","ItemName","Quantity","VariationString","ItemEAN1","ItemNumber_2"]
            writer.writerow(new_row)
            for key in sorted(extkey_dict.keys()):
                sorted_key = key
                new_row = list()
                curr_dict = extkey_dict[sorted_key]
                new_row.append(curr_dict["ItemNumber"])
                new_row.append(curr_dict["ItemName"])
                new_row.append(str(curr_dict["Quantity"]))
                new_row.append(str(curr_dict["VariationString"]).replace(".",","))
                new_row.append(str(curr_dict["ItemEAN1"]))
                new_row.append(curr_dict["ItemNumber_2"])
                writer.writerow(new_row)

def process_files(data_root):
    path_in = os.path.join(data_root, "in")
    path_out = os.path.join(data_root, "out")
    path_prc = os.path.join(data_root, "processed")
    path_err = os.path.join(data_root, "error")
    path_log = os.path.join(data_root, "log")

    files = os.listdir(path_in)
    num_files = len(files)

    print("Found {0} files...".format(num_files))

    if num_files == 0:
        return

    for f in files:
        log_file_name = os.path.splitext(f)[0] + '.log'

        in_file = os.path.join(path_in, f)
        out_file = os.path.join(path_out, f)
        prc_file = os.path.join(path_prc, f)
        err_file = os.path.join(path_err, f)
        log_file = os.path.join(path_log, log_file_name)

        if os.path.isfile(in_file):
            logging.basicConfig(filename=log_file,level=logging.DEBUG)

            logging.debug("Aggregating quantities in  {0}...".format(in_file))
            try:

                check_for_dupes(in_file, out_file)
                shutil.move(in_file, prc_file)
            except Exception as e:
                logging.error(e)
                shutil.move(in_file, err_file)


def main():
    data_root = r"/ftproot/"
    #data_root = r"/data/projects/pycharm/thelen/conversion/data/"
    #data_root = r"c:/temp/thelen/"


    dupe_data_root = os.path.join(data_root, "HK_Nike_Bestellungen")
    process_files(dupe_data_root)

if __name__ == "__main__":
    main()
