#!/usr/bin/env python

import codecs
import csv
import logging
import os
import shutil
import sys
import time


__author__ = 'Holger Knust'



# Global vars
logger = None
in_folder = None
out_folder = None
processed_folder = None
error_folder = None
ref_folder = None


def setup_logging(log_file):
    global logger

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    std_out = logging.StreamHandler(sys.stdout)
    std_out.setLevel(logging.DEBUG)
    std_out.setFormatter(formatter)
    logger.addHandler(std_out)

    file_handler = logging.FileHandler(log_file)
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.WARN)
    logger.addHandler(file_handler)

    return logger

def teardown_logger():
    global logger

    handlers = logger.handlers
    for handler in handlers:
        logger.removeHandler(handler)

def write_csv(file_name, header,  rows):
    with codecs.open(file_name, "w", encoding='utf-8') as of:
        writer = csv.writer(of, delimiter=';')

        writer.writerow(header)
        for row in rows:
            writer.writerow(row)

def extract_dupes(in_file):
    global logger

    header_read = False
    item_id_index = -1
    purchase_price_index = -1
    item_dict = dict()

    with codecs.open(in_file, "r", encoding='utf-8') as f:

        reader = csv.reader(f, delimiter=';')
        for row in reader:
            if any(row):
                if header_read:
                    item_id = row[item_id_index]
                    price_text = row[purchase_price_index].replace(",",".")
                    try:
                        price = float(price_text)
                    except ValueError:
                        logger.error("Could not convert {0}".format(price_text))
                        price = 0.0

                    if item_id in item_dict:
                        current_price, item_count = item_dict[item_id]
                        if (current_price < price):
                            current_price = price

                        item_count += 1

                        item_dict[item_id] = [current_price, item_count]
                    else:
                        item_dict[item_id] = [price,0]
                else:
                    header_read = True
                    if 'ItemID' in row:
                        item_id_index = row.index('ItemID')
                    if 'PurchasePrice' in row:
                        purchase_price_index = row.index('PurchasePrice')
    item_list = list()
    for item_id in item_dict:
        current_price, item_count = item_dict[item_id]
        if item_count > 0:
            item_list.append([item_id,current_price, 1])

    return item_list

def process():
    global logger, in_folder, out_folder, process_folder, error_folder, ref_folder, log_folder

    files = os.listdir(in_folder)
    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(in_folder, f)
        out_file = os.path.join(out_folder, f)
        prc_file = os.path.join(processed_folder, f)
        err_file = os.path.join(error_folder, f)
        log_file = os.path.join(log_folder, log_file_name)

        if os.path.isfile(in_file):
            logger.debug("Checking {0} for duplicates.".format(in_file))
            try:

                item_list = extract_dupes(in_file)
                write_csv(out_file,["ItemID","ItemPurchasePrice","ItemMarking2"], item_list)

                shutil.move(in_file, prc_file)
            except Exception as e:
                logger.error(e)
                shutil.move(in_file, err_file)


def main():
    global in_folder, out_folder, processed_folder, error_folder, ref_folder, log_folder

    #data_root = r"/home/holger/git/thelen/data/"
    data_root = r"/ftproot/"
    # data_root = r"c:/temp/thelen/"

    project_folder = os.path.join(data_root, "Matching_Intersport_Preise")

    # setup sub folder paths
    in_folder = os.path.join(project_folder, "in")
    out_folder = os.path.join(project_folder, "out")
    processed_folder = os.path.join(project_folder, "processed")
    error_folder = os.path.join(project_folder, "error")
    log_folder = os.path.join(project_folder, "log")
    ref_folder = os.path.join(project_folder, "ref")

    log_file = os.path.join(log_folder, 'find_dealer_duplicates-' + time.strftime("%Y%m%d-%H%M%S") + '.log')

    setup_logging(log_file)

    process()

    print("Done.")

if __name__ == "__main__":
    main()
