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

__author__ = 'Holger Knust'
locale_code = "de_DE.utf8" # change to de-DE.utf8 for prod

def find_different_price_items(in_file):
    header_read = False

    ean_index = -1
    price_index = -1

    eans = list()
    raw_dupes = dict()

    locale.setlocale(locale.LC_ALL, locale_code)

    with codecs.open(in_file, "r", encoding='utf-8') as f:
#        dialect = csv.Sniffer().sniff(f.read(1024), delimiters=";")
#        dialect.doublequote = True

#        f.seek(0)

        reader = csv.reader(f, delimiter=';')
        for row in reader:
            if any(row):
                if header_read:
                    ean = row[ean_index]
                    # print(ean)
                    if ean in eans:
                        try:
                            price = locale.atof(row[price_index])
                        except Exception as e:
                            logging.error(e)
                            price = 0

                        if ean in raw_dupes:
                            prices = raw_dupes[ean]
                            if not price in prices:
                                prices.append(price)
                                raw_dupes[ean] = prices
                        else:
                            raw_dupes[ean] = [price]
                    else:
                      eans.append(ean)
                else:
                    header_read = True
                    if "Artikelnummer" in row:
                      ean_index = row.index("Artikelnummer")
                    elif "ns1:ordernumber" in row:
                      ean_index = row.index("ns1:ordernumber")
                    else:
                        raise Exception("No item number column found!")

                    if "Empf VK EUR" in row:
                      price_index = row.index("Empf VK EUR")
                    elif "ns1:VK" in row:
                      price_index = row.index("ns1:VK")
                    else:
                        raise Exception("No price column found!")


    dupes = dict()
    for key, value in raw_dupes.items():
        if len(value) > 1:
            dupes[key] = value

    return dupes

def mark_children_items(in_file, out_file, duplicate_items):
    header_read = False

    ean_index = -1
    price_index = -1

    locale.setlocale(locale.LC_ALL, locale_code)

    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=";")
        #dialect.doublequote = True

        #f.seek(0)

        reader = csv.reader(f, delimiter=';', doublequote=True)
        writer = csv.writer(of, delimiter=';')
        for row in reader:
            if any(row):
                if header_read:
                    ean = row[ean_index]
                    if ean in duplicate_items:
                        try:
                            #parse  item price
                            price = locale.atof(row[price_index])

                            # grab the price list of the items with more than 1 price
                            prices = duplicate_items[ean]

                            if price == min(prices):
                                row[ean_index] = ean + "K"
                        except Exception as e:
                            logging.error(e)
                else:
                    header_read = True

                    if "Artikelnummer" in row:
                        ean_index = row.index("Artikelnummer")
                    elif "ns1:ordernumber" in row:
                        ean_index = row.index("ns1:ordernumber")
                    else:
                        raise Exception("No item number column found!")

                    if "Empf VK EUR" in row:
                        price_index = row.index("Empf VK EUR")
                    elif "ns1:VK" in row:
                        price_index = row.index("ns1:VK")
                    else:
                        raise Exception("No price column found!")

                writer.writerow(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("Marking children EANs in  {0}...".format(in_file))
            try:
                items = find_different_price_items((in_file))
                mark_children_items(in_file, out_file, items)
                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, "Matching_Kinder")
    process_files(dupe_data_root)

if __name__ == "__main__":
    main()
