#!/usr/bin/env python3

# Copyright (c) 2021 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import difflib
import logging
import os
import subprocess
import sys
from typing import List

import coloredlogs

log = logging.getLogger(__name__)

SCRIPT_ROOT = os.path.dirname(__file__)


def build_expected_output(root: str, out: str) -> List[str]:
    with open(os.path.join(SCRIPT_ROOT, 'expected_test_cmakelists.txt')) as file:
        for line in file.readlines():
            yield line.replace("{root}", root).replace("{out}", out)


def build_actual_output(root: str, out: str) -> List[str]:
    # Fake out that we have a project root
    binary = os.path.join(SCRIPT_ROOT, '../gn_to_cmakelists.py')
    project = os.path.join(SCRIPT_ROOT, "test_project.json")
    cmake = os.path.join(SCRIPT_ROOT, "../../../out/CMakeLists.txt")
    subprocess.run([
        binary,
        project,
    ], stdout=subprocess.PIPE, check=True, encoding='UTF-8')

    with open(cmake) as f:
        for line in f.readlines():
            yield line


def main():
    coloredlogs.install(level=logging.INFO,
                        fmt='%(asctime)s %(name)s %(levelname)-7s %(message)s')

    ROOT = '/TEST/BUILD/ROOT'
    OUT = '/OUTPUT/DIR'

    expected = list(build_expected_output(ROOT, OUT))
    actual = list(build_actual_output(ROOT, OUT))

    diffs = list(difflib.unified_diff(expected, actual))

    if diffs:
        log.error("DIFFERENCE between expected and generated output")
        for line in diffs:
            log.warning("  %s", line.strip())
        sys.exit(1)


if __name__ == '__main__':
    main()
