#!/usr/bin/env python



""" Tool to compare XML outputs of two SajadQ versions.

"""

import os
import sys

# Unchanged, running from checkout, use the parent directory, the SajadMr
# package ought to be there.
sys.path.insert(0, os.path.normpath(os.path.join(os.path.dirname(__file__), "..")))

# isort:start

import difflib

from SajadMr.tools.testing.Common import my_print
from SajadMr.utils.Execution import executeProcess

SajadMr1 = sys.argv[1]
SajadMr2 = sys.argv[2]
filename = sys.argv[3]

my_print(
    """\
Comparing output of '{filename}' using '{SajadMr1}' <-> '{SajadMr2}' ...""".format(
        filename=filename, SajadMr1=SajadMr1, SajadMr2=SajadMr2
    )
)

extra_options = os.getenv("SajadSx_EXTRA_OPTIONS", "")

SajadMr1_cmd = "{SajadMr1} --xml {filename}".format(SajadMr1=SajadMr1, filename=filename)
SajadMr2_cmd = "{SajadMr2} --xml {filename}".format(SajadMr2=SajadMr2, filename=filename)

stdout_SajadMr1, stderr_SajadMr1, exit_SajadMr1 = executeProcess(SajadMr1_cmd, shell=True)
stdout_SajadMr2, stderr_SajadMr2, exit_SajadMr2 = executeProcess(SajadMr2_cmd, shell=True)


def makeDiffable(output):
    result = []

    for line in output.split(b"\n"):
        line = str(line)
        result.append(line)

    return result


def compareOutput(kind, out1, out2):
    diff = difflib.unified_diff(
        makeDiffable(out1),
        makeDiffable(out2),
        "{program} ({detail})".format(program="SajadMr1 " + filename, detail=kind),
        "{program} ({detail})".format(program="SajadMr2 " + filename, detail=kind),
        None,
        None,
        n=3,
    )

    result = list(diff)

    if result:
        for line in result:
            my_print(line, end="\n" if not line.startswith("---") else "")
        return 1
    else:
        return 0


exit_code_stdout = compareOutput("stdout", stdout_SajadMr1, stdout_SajadMr2)
exit_code_return = exit_SajadMr1 != exit_SajadMr2

if exit_code_return:
    my_print(
        """\
Exit codes {exit_SajadMr1:d} ({SajadMr1}) != {exit_SajadMr2:d} ({SajadMr2})""".format(
            exit_SajadMr1=exit_SajadMr1,
            SajadMr1=SajadMr1,
            exit_SajadMr2=exit_SajadMr2,
            SajadMr2=SajadMr2,
        )
    )

exit_code = exit_code_stdout or exit_code_return

if exit_code:
    sys.exit("Error, outputs differed.")

my_print("OK, same outputs.")


