#!/usr/bin/env python
#
# Copyright 2022 The Dawn 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 os
import shutil
import sys

from dir_paths import webgpu_cts_root_dir, node_dir
from tsc_ignore_errors import run_tsc_ignore_errors

try:
    old_sys_path = sys.path
    sys.path = [node_dir] + sys.path

    from node import RunNode
finally:
    sys.path = old_sys_path


def compile_src(out_dir):
    # First, clean the output directory so deleted files are pruned from old builds.
    shutil.rmtree(out_dir)

    run_tsc_ignore_errors([
        '--project',
        os.path.join(webgpu_cts_root_dir, 'tsconfig.json'),
        '--outDir',
        out_dir,
        '--noEmit',
        'false',
        '--noEmitOnError',
        'false',
        '--declaration',
        'false',
        '--sourceMap',
        'false',
        '--target',
        'ES2017',
    ])


def compile_src_for_node(out_dir, additional_args=None, clean=True):
    additional_args = additional_args or []
    if clean:
        # First, clean the output directory so deleted files are pruned from old builds.
        shutil.rmtree(out_dir)

    args = [
        '--project',
        os.path.join(webgpu_cts_root_dir, 'node.tsconfig.json'),
        '--outDir',
        out_dir,
        '--noEmit',
        'false',
        '--noEmitOnError',
        'false',
        '--declaration',
        'false',
        '--sourceMap',
        'false',
        '--target',
        'ES6',
    ]
    args.extend(additional_args)

    run_tsc_ignore_errors(args)


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('Usage: compile_src.py GEN_DIR')
        sys.exit(1)

    gen_dir = sys.argv[1]

    # Compile the CTS src.
    compile_src(os.path.join(gen_dir, 'src'))
    compile_src_for_node(os.path.join(gen_dir, 'src-node'))

    # Run gen_listings.js to overwrite the dummy src/webgpu/listings.js created
    # from transpiling src/
    RunNode([
        os.path.join(gen_dir, 'src-node', 'common', 'tools',
                     'gen_listings.js'),
        '--no-validate',
        os.path.join(gen_dir, 'src'),
        os.path.join(gen_dir, 'src-node', 'webgpu'),
    ])
