# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os

_common_checks_ran = False


def GlicCommonChecks(input_api, output_api):
    global _common_checks_ran
    if _common_checks_ran:
        return []
    _common_checks_ran = True

    return (_CheckGlicGeneratedApi(input_api, output_api) +
            _CheckRuntimeFeatureChecksIfModified(input_api, output_api))


def _CheckGlicGeneratedApi(input_api, output_api):
    monitored_files = (
        'chrome/common/actor_webui.mojom',
        'chrome/browser/glic/host/glic.mojom',
        'chrome/browser/resources/glic/glic_api_impl/generate.py',
        'chrome/browser/resources/glic/glic_api/glic_api.ts',
    )
    if not any(
        [f.LocalPath() in monitored_files for f in input_api.AffectedFiles()]):
        return []

    os_path = input_api.os_path
    src_root = os_path.join(os.path.dirname(__file__), '../../../..')
    cmd = [
        input_api.python_executable,
        input_api.os_path.join(
            src_root,
            'chrome/browser/resources/glic/glic_api_impl/generate.py'),
        '--check-only',
    ]

    try:
        input_api.subprocess.check_output(cmd,
                                          stderr=input_api.subprocess.STDOUT)
    except input_api.subprocess.CalledProcessError as e:
        message = e.output.decode('utf-8')
        return [output_api.PresubmitError(message)]
    return []


def _CheckRuntimeFeatureChecksIfModified(input_api, output_api):
    MONITORED_FILES = set((
        'chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts',
        'chrome/browser/glic/host/glic.mojom',
        'chrome/browser/resources/glic/presubmit/check_runtime_features.py',
    ))

    os_path = input_api.os_path
    src_root = os_path.join(os.path.dirname(__file__), '../../../..')

    if not (set(input_api.UnixLocalPaths()) & MONITORED_FILES):
        return []

    cmd = [
        input_api.python_executable,
        os_path.join(
            src_root,
            'chrome/browser/resources/glic/presubmit/check_runtime_features.py'
        ),
    ]

    try:
        input_api.subprocess.check_output(cmd)
    except input_api.subprocess.CalledProcessError as e:
        message = ('glic check_runtime_features.py failed:\n' +
                   e.output.decode('utf-8'))
        return [output_api.PresubmitError(message)]
    return []
