#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import os
import glob
import shutil
import csv
import argparse

def main(argv):
    if argv.c and argv.veno :
        clear_errors(argv.logpath, argv.veno)
        backup_csv(argv.logpath, argv.veno)
    elif not argv.c and not argv.veno:
        backup_csv(argv.logpath)
    else:
        print("Failed")
        sys.exit(0)

def backup_csv(logpath, veno=99):
    log_dir = logpath+"/ECCLOG"
    bkup_dir = logpath+"/ECCLOG_BAK"
    info_dir = logpath+"/info"

    if(os.path.exists(bkup_dir)): pass
    else:
        try: os.mkdir(bkup_dir)
        except: sys.exit(0)

    if(veno==99): id_filelist = glob.glob(info_dir+"/chip_id*")
    else: id_filelist = glob.glob(info_dir+"/chip_id"+veno)
    id_list = []
    for i in id_filelist:
        with open(i, "r") as c:
            id_list.append(c.read().rstrip('\n'))

    csv_filelist = [i for i in glob.glob(log_dir+"/*")]
    cpuid_dir = gen_cpuid_from_csv(csv_filelist)

    if(veno==99): move_list = [i for i,j in list(cpuid_dir.items()) if j not in id_list ]
    else: move_list = [i for i,j in list(cpuid_dir.items()) if j in id_list ]

    if(not move_list):
        sys.exit(0)
    else:
        for i in move_list:
            try: shutil.move(i,bkup_dir)
            except : # overwrite
                fname = os.path.basename(i)
                bk_fname = bkup_dir+"/"+fname
                if os.path.exists(bk_fname):
                    os.remove(bk_fname)
                    try: shutil.move(i,bkup_dir)
                    except: sys.exit(0)
                else:
                    sys.exit(0)
        sys.exit(1)


def gen_cpuid_from_csv(csvpaths):
    dirct = {}
    for i in csvpaths:
        if("csv" not in i): continue
        with open(i, "r") as c:
            l = list(csv.DictReader(c))
            try: dirct[i] = l[0]["CPUID"]
            except: continue
    return dirct


def clear_errors(logpath, veno):
    if veno == "ALL":
        faultpath = logpath+'/info/*fault*'
        eccpath = logpath+'/info/eccs*'
    else:
        faultpath = logpath+'/info/*fault*'+str(veno)
        eccpath = logpath+'/info/eccs*'+str(veno)
    try:
        for file in glob.glob(faultpath):
            os.remove(file)
        for file in glob.glob(eccpath):
            os.remove(file)
    except:
        print("Failed")
        sys.exit(0)

    print("Success")

if __name__ == '__main__':
    option = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
    option.add_argument("-c", help="clear errors & backup old ECC clear", action="store_true")
    option.add_argument("-v", dest='veno', help="VE nomber (ALL/0/1/2/...)")
    option.add_argument("-d", dest='logpath', help="log_dir", default="/var/opt/nec/ve3/mmm/log")
    argv = option.parse_args()

    main(argv)

