# Copyright 2025 Google LLC
#
# 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 argparse
import re


def find_cocotb_tests(filename):
    with open(filename, "r") as f:
        source = f.read()
    return re.findall(r"@cocotb\.test\(.*\)\s+async def\s+(\w+)", source)


def update_build_file(build_file, test_file, variable_name, name):
    test_names = find_cocotb_tests(test_file)
    with open(build_file, "r") as f:
        lines = f.readlines()

    start_marker = f"# BEGIN_TESTCASES_FOR_{name}\n"
    end_marker = f"# END_TESTCASES_FOR_{name}\n"

    try:
        start_index = lines.index(start_marker)
        end_index = lines.index(end_marker)
    except ValueError:
        print(f"Error: Markers not found for {name} in {build_file}")
        return

    new_lines = lines[:start_index + 1]
    new_lines.append(f'{variable_name} = [\n')
    for name in test_names:
        new_lines.append(f'    "{name}",\n')
    new_lines.append(']\n')
    new_lines.extend(lines[end_index:])

    with open(build_file, "w") as f:
        f.writelines(new_lines)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--build_file", required=True)
    parser.add_argument("--test_file", required=True)
    parser.add_argument("--variable_name", required=True)
    parser.add_argument("--name", required=True)
    args = parser.parse_args()
    update_build_file(args.build_file, args.test_file, args.variable_name,
                      args.name)
