#!/usr/bin/env python

__author__ = 'holger.knust'

import codecs
import csv
from datetime import datetime
import logging
import os
import shutil


def read_shipper_lookup(ref_path):
    ref_dict = {}

    header_row = []
    header_read = False
    shipper_id_index = -1
    shipper_code_index = -1

    full_ref_path = os.path.join(ref_path, "Referenz_Versanddienstleister.csv")
    with codecs.open(full_ref_path, "rb", encoding='utf-8') as f:

        reader = csv.reader(f, delimiter=';')
        for row in reader:
            if header_read:
                ref_dict[row[shipper_id_index]] = row[shipper_code_index]
            else:
                if 'parcel_service_preset_id' in row:
                    shipper_id_index = row.index('parcel_service_preset_id')

                if 'carrier-code' in row:
                    shipper_code_index = row.index('carrier-code')

                header_read = True

    return ref_dict


def convert_tracking(in_file, out_file, ref_dict):
    header_read = False
    ext_id_index = -1
    paid_ts_index = -1
    service_id_index = -1
    package_num_index = -1

    out_header = ["order-id", "order-item-id", "quantity", "ship-date", "carrier-code", "carrier-name",
                  "tracking-number", "ship-method"]

    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='\t')

        for row in reader:
            if any(row):
                if header_read:
                    ext_id = row[ext_id_index]

                    if len(ext_id) > 0:
                        paid_ts = row[paid_ts_index]

                        if len(paid_ts) > 0:
                            try:
                                paid_dt = datetime.strptime(paid_ts, '%Y-%m-%d %H:%M:%S')
                            except:
                                paid_dt = datetime.now()

                        package_num = row[package_num_index]

                        if len(package_num) == 0:
                            package_num = '00340499999999999999'

                        service_id = row[service_id_index]
                        if service_id in ref_dict:
                            service_code = ref_dict[service_id]
                        else:
                            service_code = ''

                        row = [ext_id, '', '', paid_dt.strftime('%Y-%m-%d'), service_code, service_code, package_num,
                               service_code]

                        writer.writerow(row)
                else:
                    header_read = True
                    ext_id_index = row.index('external_order_id')
                    paid_ts_index = row.index('order_timestamp')
                    service_id_index = row.index('parcel_service_preset_id')
                    package_num_index = row.index('packagenum')
                    writer.writerow(out_header)


def process_tracking(data_root):
    path_ref = os.path.join(data_root, "ref")
    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)

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

    if num_files == 0:
        return

    sh_dict = read_shipper_lookup(path_ref)

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

        in_file = os.path.join(path_in, f)
        out_file = os.path.join(path_out, out_file_name)
        proc_file = os.path.join(path_proc, f)
        err_file = os.path.join(path_err, f)
        log_file = os.path.join(path_log, log_file_name)

        logging.basicConfig(filename=log_file, level=logging.DEBUG)

        logging.debug("Converting tracking info in {0}...".format(in_file))

        if os.path.isfile(in_file):
            print("Converting {0} to {1}...".format(in_file, out_file))
            try:
                convert_tracking(in_file, out_file, sh_dict)
                shutil.move(in_file, proc_file)
            except Exception as e:
                print(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"/ftproot/"

    amazon_root = os.path.join(data_root, "Matching_Amazon_Rueckmeldung")

    process_tracking(amazon_root)

    print("Done.")


if __name__ == "__main__":
    main()

