#!/usr/bin/env python3.6
import codecs
import csv
import os
import logging
import logging.config
import shutil

import common

logger = None


def create_parent_child(in_file, out_file):
    header_read = False
    itm_num_idx = -1
    ean_idx = -1
    var_num_idx = -1
    size_idx = -1
    size_name_idx = -1
    sup_size_name_idx = -1
    current_itm_num = None

    with codecs.open(
            in_file, "r", encoding="utf-8") as f, codecs.open(
                out_file, "w", encoding="utf-8") as of:
        reader = csv.reader(f, delimiter=';')
        writer = csv.writer(of, delimiter=';')

        for row in reader:
            if header_read:
                itm_num = row[itm_num_idx]
                if itm_num != current_itm_num:
                    parent_row = row[:]
                    current_itm_num = itm_num
                    parent_row[ean_idx] = None
                    parent_row[size_idx] = None
                    parent_row[size_name_idx] = None
                    parent_row[sup_size_name_idx] = None
                    parent_row[var_num_idx] = None
                    # Shift row to the right by 1 column
                    parent_row.insert(0, None)
                    writer.writerow(parent_row)

                row.insert(1, row[var_num_idx])
                
            else:
                if "Artikelnummer" in row:
                    itm_num_idx = row.index("Artikelnummer")
                if "EAN" in row:
                    ean_idx = row.index("EAN")
                if "Variantennummer" in row:
                    var_num_idx = row.index("Variantennummer")
                if "IDE_SIZE_NAME" in row:
                    size_name_idx = row.index("IDE_SIZE_NAME")
                if "IDESizeIndex" in row:
                    size_idx = row.index("IDESizeIndex")
                if "SUP_SIZE_NAME" in row:
                    sup_size_name_idx = row.index("SUP_SIZE_NAME")

                if itm_num_idx < 0 or ean_idx < 0 or var_num_idx < 0 or size_name_idx < 0 or size_idx < 0 or sup_size_name_idx < 0:
                    raise Exception("Missing column(s)")

                header_read = True

                row.insert(0, "Hauptvariantenummer")

            writer.writerow(row)


def process_files(data_root):
    global logger

    path_in = os.path.join(data_root, "in")
    path_out = os.path.join(data_root, "out")
    path_proc = 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)

    log_file_path = os.path.join(path_log, "parent_child.log")
    logging.config.dictConfig(common.get_logging_config(log_file_path))

    logger = logging.getLogger(__file__)

    logger.info("Found %d files...", num_files)

    if num_files == 0:
        return

    for f in files:
        in_file_path = os.path.join(path_in, f)
        out_file_path = os.path.join(path_out, f)
        err_file_path = os.path.join(path_err, f)
        prc_file_path = os.path.join(path_proc, f)
        try:
            logger.info("Proccesing %s...", f)
            create_parent_child(in_file_path, out_file_path)

            if os.path.isfile(prc_file_path):
                os.remove(prc_file_path)

            shutil.move(in_file_path, prc_file_path)
        except Exception as e:
            logger.error(e)

            if os.path.isfile(err_file_path):
                os.remove(err_file_path)

            shutil.move(in_file_path, err_file_path)

    logging.shutdown()


def main():
    data_root = r"/ftproot/"
    # data_root = r"/home/holger/git/bitbucket/thelen/data/"

    data_root = os.path.join(data_root, "Matching_Parent_Child")
    process_files(data_root)


if __name__ == "__main__":
    main()