import os
from pathlib import Path
from typing import List

from resources import REGENERATE_FIXTURES
from resources import RESOURCE_PATH

from ytdl_sub.utils.file_handler import FileHandlerTransactionLog

_TRANSACTION_LOG_SUMMARY_PATH = RESOURCE_PATH / "transaction_log_summaries"


def assert_transaction_log_matches(
    output_directory: Path | str,
    transaction_log: FileHandlerTransactionLog,
    transaction_log_summary_file_name: str,
):
    """
    Parameters
    ----------
    output_directory
        Output directory the files are saved to
    transaction_log
        Transaction log to check
    transaction_log_summary_file_name
        Name if the transaction log summary to compare.
        Lives in tests/e2e/resources/transaction_log_summaries
    """
    transaction_log_path = _TRANSACTION_LOG_SUMMARY_PATH / transaction_log_summary_file_name
    summary = transaction_log.to_output_message(output_directory=output_directory)

    # USE WITH CAUTION - MANUALLY INSPECT CHANGED FILES TO ENSURE THEY LOOK GOOD!
    # Updates the file with the input transaction log. Should only be used to update
    # tests after an expected change is made.
    if REGENERATE_FIXTURES:
        os.makedirs(os.path.dirname(transaction_log_path), exist_ok=True)
        with open(transaction_log_path, "w", encoding="utf-8") as summary_file:
            summary_file.write(
                transaction_log.to_output_message(output_directory="{output_directory}")
            )

    # Read the expected summary file
    with open(transaction_log_path, "r", encoding="utf-8") as summary_file:
        expected_summary = summary_file.read().format(
            output_directory=FileHandlerTransactionLog.format_path_str(output_directory)
        )

    # Split, ensure there are the same number of new lines
    summary_lines: List[str] = summary.split("\n")
    expected_summary_lines: List[str] = expected_summary.split("\n")
    assert len(summary_lines) == len(
        expected_summary_lines
    ), f"Summary number of lines differ: {len(summary_lines) != len(expected_summary_lines)}"

    # Ensure each line equals
    for idx in range(len(summary_lines)):
        line = summary_lines[idx]
        expected_line = expected_summary_lines[idx]
        assert line == expected_line, f"Summary line {idx} differs: '{line}' != '{expected_line}'"
