#!/usr/bin/env python3
import argparse
import difflib
import filecmp
import os
import shutil
import subprocess
import tempfile

TOOLS_DIR = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))


def generate_files(source_file: str, tmp_dir: str) -> None:
    # Copy the source CSV file to out temporary test directory.
    input_file_path = source_file
    output_file_path = os.path.join(tmp_dir, "CSV_A")
    shutil.copyfile(input_file_path, output_file_path)

    # Generate the name map file in the temporary directory.
    input_file_path = output_file_path
    output_file_path = os.path.join(tmp_dir, "NAME_MAP_A")
    subprocess.check_call(
        [
            os.path.join(TOOLS_DIR, "setup", "emoji", "import_emoji_names_from_csv"),
            f"--input-file={input_file_path}",
            f"--output-file={output_file_path}",
        ],
        stdout=subprocess.DEVNULL,
    )

    # Regenerate the CSV file from name map.
    input_file_path = output_file_path
    output_file_path = os.path.join(tmp_dir, "CSV_B")
    subprocess.check_call(
        [
            os.path.join(TOOLS_DIR, "setup", "emoji", "export_emoji_names_to_csv"),
            f"--input-file={input_file_path}",
            f"--output-file={output_file_path}",
        ],
        stdout=subprocess.DEVNULL,
    )

    # Regenerate the name map file from the regenerated CSV file.
    input_file_path = output_file_path
    output_file_path = os.path.join(tmp_dir, "NAME_MAP_B")
    subprocess.check_call(
        [
            os.path.join(TOOLS_DIR, "setup", "emoji", "import_emoji_names_from_csv"),
            f"--input-file={input_file_path}",
            f"--output-file={output_file_path}",
        ],
        stdout=subprocess.DEVNULL,
    )


def print_diff(path_file1: str, path_file2: str) -> None:
    with open(path_file1) as file1:
        with open(path_file2) as file2:
            diff = difflib.unified_diff(
                file1.readlines(),
                file2.readlines(),
                fromfile=path_file1,
                tofile=path_file2,
            )
    for line in diff:
        print(line)


def compare_files(first_file: str, second_file: str) -> None:
    same = True
    same = same and filecmp.cmp(first_file, second_file, shallow=False)
    if not same:
        print_diff(first_file, second_file)
        raise Exception("Round trip conversion failed!!")


def check_files(tmp_dir: str) -> None:
    # Compare the original and regenerated CSV files.
    first_file = os.path.join(tmp_dir, "CSV_A")
    second_file = os.path.join(tmp_dir, "CSV_B")
    compare_files(first_file, second_file)

    # Compare the name map files.
    first_file = os.path.join(tmp_dir, "NAME_MAP_A")
    second_file = os.path.join(tmp_dir, "NAME_MAP_B")
    compare_files(first_file, second_file)


def main() -> None:
    description = (
        "This tool is used test the emoji tooling that we use to import/export "
        "naming related data. This works by doing a round-trip conversion of "
        "and then verifying that no changes were made in the process."
    )
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument(
        "--input-file",
        dest="input_file_path",
        metavar="<path>",
        default=os.path.join(TOOLS_DIR, "setup", "emoji", "emoji_names.csv"),
        help="Path to the CSV file to be used for round-trip conversion.",
    )

    args = parser.parse_args()
    with tempfile.TemporaryDirectory() as tmp_dir:
        generate_files(args.input_file_path, tmp_dir)
        check_files(tmp_dir)


if __name__ == "__main__":
    main()
