import json
import shutil

import plugins.agl_test_conf as conf

#Compress the tmp log to .zip
def log_compress(THIS_TEST):
    base_name = conf.get_log_dir(THIS_TEST)
    root_dir = conf.get_tmp_log_dir(THIS_TEST)
    shutil.make_archive(base_name,'zip',root_dir)


#Get all test cases status
#The type of test_cases_values_and_status is list,it's looks like that:
#[['test_id', 'values', 'status'], ['rpm01', 'TEST-PASS', 'passed'],....]
#The type of case_status is directory,it's looks like:
#{'rpm03': 'passed', 'rpm02': 'passed', 'rpm01': 'passed'}
def get_case_status(test_cases_values_and_status):
    num = len(test_cases_values_and_status)
    case_status = {}
    for i in range(num):
        if (i==0):
            continue
        case_status[test_cases_values_and_status[i][0]] = test_cases_values_and_status[i][2]
    return case_status

#Input format
# {
#  "test_id": ['test_id', 'values', 'status'],
#  "test_id": ['test_id', 'values', 'status']
# }
#Output format
# {
#  'test_id': 'status',
#  'test_id': 'status'
# }
def format_caselist(case_info_list: dict):
    case_status = dict()
    for key in case_info_list:
        case_info = case_info_list[key]
        case_status[key] = case_info[2]
    return case_status


#Input format
# {
#  "test_id": ['test_id', 'values', 'status'],
#  "test_id": ['test_id', 'values', 'status']
# }
#Output format
# {
#  'collected': collected_num,
#  'passed': passed_num,
#  'failed': failed_num,
#  'skipped": skipped_num
# }
def format_summary(case_info_list):
    collected_num = passed_num = xpassed_num = failed_num = xfailed_num = skipped_num = 0
    for key in case_info_list:
        case_info = case_info_list[key]
        collected_num = collected_num + 1
        if (case_info[2] == "passed"):
            passed_num = passed_num + 1
        elif (case_info[2] == "xpassed"):
            xpassed_num = xpassed_num + 1
        elif (case_info[2] == "failed"):
            failed_num = failed_num + 1
        elif (case_info[2] == "xfailed"):
            xfailed_num = xfailed_num + 1
        else:
            skipped_num = skipped_num + 1
    summary = dict()
    summary["collected"] = collected_num
    summary["passed"] = passed_num
    summary["xpassed"] = xpassed_num
    summary["failed"] = failed_num
    summary["xfailed"] = xfailed_num
    summary["skipped"] = skipped_num
    return summary

def format_json_data(name, test_set_status, summary, case_status):
    data = summary
    data["test_name"] = name
    data["test_status"] = test_set_status
    data["case_status"] = case_status
    return summary

#Write the test result to a json file
def write_data_to_json(THIS_TEST,test_set_status,summary,case_status):
    #The data that will be written into the json file
    data =  {
                'test_status': test_set_status,
                'test_name': THIS_TEST,
                'collected': summary[0][1],
                'passed': summary[1][1],
                'xpassed': summary[2][1],
                'failed': summary[3][1],
                'xfailed': summary[4][1],
                'skipped': summary[5][1],
                'case_status': case_status
            }

    #Write the "data" to the json file
    write_data_to_file(data, "json")

def get_report_html(THIS_TEST,test_set_status,summary,case_status):
    html = "<html>"

    #<head> </head>
    html = html + "<head>"
    html = html + "<title>"
    html = html + THIS_TEST + "test report"
    html = html + "</title>"
    html = html + "</head>"

    #<body> </body>
    html = html + "<body>"
    html = html + "<h1>" + THIS_TEST + " test report" + "</h1>"
    html = html + "<p>" + "Status :" + test_set_status + "</p>"
    html = html + "<p>" + "Total: " + str(summary[0][1])
    html = html + "  Pass: " + str(summary[1][1])
    html = html + "  Xpass: " + str(summary[2][1])
    html = html + "  Fail: " + str(summary[3][1])
    html = html + "  Xfail: " + str(summary[4][1])
    html = html + "  Skip: " + str(summary[5][1]) + "</p>"
    html = html + "<p>Details : </p>"

    #<table> </table>
    html = html + "<table border=\"1\" cellspacing=\"2\" >"
    html = html + "<tr bgcolor = \"2400B0\">"
    html = html + "<th><font color = \"white\">test case</font></th>"
    html = html + "<th><font color = \"white\">status</font></th>"
    html = html + "</tr>"

    #Add content to the table
    bgcolor = 0
    for test_case in case_status:
        if bgcolor == 0:
            html = html + "<tr bgcolor = \"CCCBE4\">"
            bgcolor = 1
        else:
            html = html + "<tr bgcolor = \"E8E7F2\">"
            bgcolor = 0
        html = html + "<th>" + test_case + "</th>"
        html = html + "<th>" + case_status[test_case] + "</th>"
        html = html + "</tr>"

    html = html + "</table>"
    html = html + "<p></p>"
    html = html + "<font>Detail log :</font>"
    #TODO update the link address for log.zip
    html = html + "<a href=\"" + THIS_TEST + "/log.zip" + "\">log.zip</a>"
    html = html + "</body>"
    html = html + "</html>"

    return html

def write_to_html_file(THIS_TEST,html):
    html_path = conf.get_html_filename(THIS_TEST)
    html_file = open(html_path,"w")
    html_file.write(html)
    html_file.close()

def create_gen_web_page(filename, tlpname, html_data):
    # here, jinja2 module should be installed first
    from jinja2 import Environment,FileSystemLoader
    env = Environment(loader=FileSystemLoader(conf.get_tpl_dir()))
    template = env.get_template(tlpname)
    with open(filename,'w+') as f:
        html_content = template.render(data=html_data)
        f.write(html_content)
    f.close()

def write_data_to_file(data, file_type = "json"):
    testname = data["test_name"]
    if (file_type == "json"):
        filename = conf.get_json_filename(testname)
        with open(filename,'w') as f:
            json.dump(data,f,indent=4,sort_keys=False)
        f.close()
    elif (file_type == "html"):
        filename = conf.get_html_filename(testname)
        tlpname = conf.get_default_html_tpl()
        create_gen_web_page(filename, tlpname, data)
    else:
        #TODO waiting for adding
        print("ERROR: file type %s is error. Expect json or html." % file_type)

def change_json_to_html(test_set_name):
    json_file = conf.get_json_filename(test_set_name)
    html_file = conf.get_html_filename(test_set_name)
    #read data from json file
    html_data = dict()
    with open(json_file,'r') as f:
        html_data = json.load(f)
    f.close()

    #format json data to html data
    html_data["case_status_html"] = format_case_status_table(html_data["case_status"])

    #save data to html file
    write_data_to_file(html_data, "html")

def format_case_status_table(case_status):
    html_data = ""
    #init table title
    bgcolor = conf.BGCOLOR_TABLE_TITLE
    color = conf.COLOR_TABLE_TITLE
    html_data += "\t<tr bgcolor = \"" + bgcolor + "\">\n"
    html_data += "\t\t<th><font color = \"" + color + "\"> test case </font></th>\n"
    html_data += "\t\t<th><font color = \"" + color + "\"> status </font></th>\n"
    html_data += "\t</tr>\n"

    #init all rows
    bgcolor = conf.BGCOLOR_DARK
    for key in case_status:
        if ( bgcolor == conf.BGCOLOR_DARK ):
            html_data += "\t<tr bgcolor = \"" + bgcolor + "\">\n"
            bgcolor = conf.BGCOLOR_LIGHT
        else:
            html_data += "\t<tr bgcolor = \"" + bgcolor + "\">\n"
            bgcolor = conf.BGCOLOR_DARK
        html_data += "\t\t<th>" + key + "</th>\n"
        html_data += "\t\t<th>" + case_status[key] + "</th>\n"
        html_data += "\t</tr>\n"
    return html_data