#!/usr/bin/env python3.6

import codecs
import csv
import logging
import logging.config
import os
import shutil

import common

logger = None

COL_HEADER_QTY = 'quantity'

def replace_null_bytes(in_file, out_file):
    with open(in_file, 'rb') as f, open(out_file, 'wb') as of:
        data = f.read().decode('utf-8')
        of.write(data.replace('\x00', '').encode('utf-8'))

def filter_file(in_file, processed_folder):
    header_read = False
    qty_col_index = -1

    filtered_file = os.path.join(processed_folder, "adidas_stock_2.csv")

    with codecs.open(in_file, "rb", encoding="utf-8") as f, \
        codecs.open(filtered_file, "w", encoding="utf-8") as of:

        reader = csv.reader(f, delimiter=";")
        writer = csv.writer(of, delimiter=";")

        for row in reader:
            if header_read:
                try:
                    qty = int(row[qty_col_index].strip())
                except ValueError:
                    logger.warn("Could not parse %s", row[qty_col_index])
                    qty = 0

                if qty > 0:
                    writer.writerow(row)
            else:
                header_read = True
                row_lower = [x.lower() for x in row]
                qty_col_index = row_lower.index(COL_HEADER_QTY)
                if qty_col_index < 0:
                    raise Exception("Missing Quantity column")

                writer.writerow(row)


def process(project_root):
    global logger

    path_in = project_root
    path_proc = os.path.join(project_root, "processed")
    path_log = os.path.join(project_root, "log")

    if not os.path.exists(path_proc):
        os.mkdir(path_proc)

    if not os.path.exists(path_log):
        os.mkdir(path_log)

    log_file = os.path.join(path_log, os.path.basename(__file__) + ".log")
    logging.config.dictConfig(common.get_logging_config(log_file))

    logger = logging.getLogger(__file__)

    files = os.listdir(path_in)
    num_files = len(files)

    logger.info("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)
        proc_file = os.path.join(path_proc, f)
        log_file = os.path.join(path_log, log_file_name)

        if os.path.isfile(in_file) and f == "adidas_stock.csv":
            logger.debug("Performing Adidas EDI Filter...%s", in_file)

            try:
                temp_file = os.path.join(path_in, 'temp.csv')
                replace_null_bytes(in_file, temp_file)
                filter_file(temp_file, path_proc)
                shutil.move(in_file, proc_file)
                os.remove(temp_file)
            except Exception as e:
                print(e)
                logger.error(e)

def main():
    if os.path.exists(r"/ftproot/"):
        data_root = r"/ftproot"
    elif os.path.exists(r"/home/holger/git/bitbucket/thelen/data/"):
        data_root = r"/home/holger/git/bitbucket/thelen/data"
    else:
        print("Unknown environment. Please set data_root to data folder location. Aborting.")
        return

    project_root = os.path.join(data_root, "adidas_edi")

    process(project_root)

    print("Done.")

if __name__ == "__main__":
    main() 
