#!/usr/bin/env python
#
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os.path as path
import re
import subprocess
import sys

scripts_path = path.dirname(path.dirname(path.abspath(__file__)))
sys.path.append(scripts_path)
import devtools_paths

files_to_lint = None

if len(sys.argv) >= 2:
    if sys.argv[1] == '--help':
        print('Usage: %s [file|dir|glob]*' % path.basename(sys.argv[0]))
        print
        print(' [file|dir|glob]*  Path or glob to run eslint on.')
        print('                   If absent, the entire frontend will be checked.')
        sys.exit(0)

    else:
        print('Linting only these files:\n %s' % sys.argv[1:])
        files_to_lint = sys.argv[1:]

is_cygwin = sys.platform == 'cygwin'


def popen(arguments, cwd=None):
    return subprocess.Popen(arguments, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)


def to_platform_path(filepath):
    if not is_cygwin:
        return filepath
    return re.sub(r'^/cygdrive/(\w)', '\\1:', filepath)


def to_platform_path_exact(filepath):
    if not is_cygwin:
        return filepath
    output, _ = popen(['cygpath', '-w', filepath]).communicate()
    # pylint: disable=E1103
    return output.strip().replace('\\', '\\\\')


devtools_path = devtools_paths.devtools_root_path()
devtools_frontend_path = path.join(devtools_path, 'front_end')

print('Linting JavaScript with eslint...\n')


def js_lint(files_list=None):
    eslint_errors_found = False

    if files_list is None:
        files_list = [devtools_frontend_path]
    files_list = [file_name for file_name in files_list if not file_name.endswith('.eslintrc.js')]

    eslintconfig_path = path.join(devtools_path, '.eslintrc.js')
    eslintignore_path = path.join(devtools_path, '.eslintignore')
    exec_command = [
        devtools_paths.node_path(),
        devtools_paths.eslint_path(),
        '--config',
        to_platform_path_exact(eslintconfig_path),
        '--ignore-path',
        to_platform_path_exact(eslintignore_path),
        '--fix',
    ] + files_list

    eslint_proc = popen(exec_command, cwd=devtools_path)
    (eslint_proc_out, _) = eslint_proc.communicate()
    if eslint_proc.returncode != 0:
        eslint_errors_found = True
    else:
        print('eslint exited successfully')

    print(eslint_proc_out)
    return eslint_errors_found


def main():
    errors_found = js_lint(files_to_lint)

    if errors_found:
        print('ERRORS DETECTED')
        sys.exit(1)


if __name__ == '__main__':
    main()
