#!/usr/bin/env python3
# Copyright (c) 2024, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""CFE et al presubmit python script.

See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into gcl.
"""

import importlib.util
import importlib.machinery
import os.path
import subprocess

USE_PYTHON3 = True


def load_source(modname, filename):
    loader = importlib.machinery.SourceFileLoader(modname, filename)
    spec = importlib.util.spec_from_file_location(modname,
                                                  filename,
                                                  loader=loader)
    module = importlib.util.module_from_spec(spec)
    # The module is always executed and not cached in sys.modules.
    # Uncomment the following line to cache the module.
    # sys.modules[module.__name__] = module
    loader.exec_module(module)
    return module


def runSmokeTest(input_api, output_api):
    local_root = input_api.change.RepositoryRoot()
    utils = load_source('utils', os.path.join(local_root, 'tools', 'utils.py'))
    dart = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dart')
    test_helper = os.path.join(local_root, 'pkg', 'front_end',
                               'presubmit_helper.dart')

    windows = utils.GuessOS() == 'win32'
    if windows:
        dart += '.exe'

    if not os.path.isfile(dart):
        print('WARNING: dart not found: %s' % dart)
        return []

    if not os.path.isfile(test_helper):
        print('WARNING: CFE et al presubmit_helper not found: %s' % test_helper)
        return []

    args = [
        dart, test_helper,
        input_api.PresubmitLocalPath(),
        input_api.change.UpstreamBranch()
    ]
    process = subprocess.Popen(args,
                               stdout=subprocess.PIPE,
                               stdin=subprocess.PIPE)
    outs, _ = process.communicate()

    if process.returncode != 0:
        return [
            output_api.PresubmitError('CFE et al presubmit script failure(s):',
                                      long_text=outs)
        ]

    return []


def CheckChangeOnCommit(input_api, output_api):
    return runSmokeTest(input_api, output_api)


def CheckChangeOnUpload(input_api, output_api):
    return runSmokeTest(input_api, output_api)
