#!/usr/bin/env python3
# Copyright (C) 2025 The Android Open Source Project
#
# 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 subprocess
import sys
from pathlib import Path

ROOT_DIR = Path(__file__).parent.parent
FORMAT_SQL = ROOT_DIR / 'tools' / 'format_sql.py'
STDLIB_PATH = ROOT_DIR / 'src' / 'trace_processor' / 'perfetto_sql' / 'stdlib'

def main():
    parser = argparse.ArgumentParser(description='Format SQL files in the stdlib directory')
    parser.add_argument('paths',
                       nargs='*',
                       help='Optional paths to format (must be within stdlib)')
    parser.add_argument('--check-only',
                       action='store_true',
                       help='Check if files are properly formatted without making changes')
    parser.add_argument('--verbose',
                       action='store_true',
                       help='Print status messages during formatting')
    args = parser.parse_args()

    if not STDLIB_PATH.exists():
        print(f'Error: stdlib directory not found at {STDLIB_PATH}',
              file=sys.stderr)
        return 1

    paths_to_format = [str(STDLIB_PATH)] if not args.paths else args.paths
    cmd = [str(FORMAT_SQL)] + paths_to_format
    if args.check_only:
        cmd.append('--check-only')
    else:
        cmd.append('--in-place')
    if args.verbose:
        cmd.append('--verbose')

    try:
        return subprocess.run(cmd, check=False).returncode
    except subprocess.CalledProcessError as e:
        return e.returncode

if __name__ == '__main__':
    sys.exit(main())