#!/usr/bin/env python3

# This is a command-line interface to the pycwb package. It provides options like
# pycwb create, pycwb run, pycwb server, etc. It is a wrapper around the pycwb package

import argparse
import pycwb.cli.server as server
import pycwb.cli.run as run
import pycwb.cli.flow as flow
import pycwb.cli.batch_setup as batch_setup
import pycwb.cli.config_setup as config_setup
import pycwb.cli.clone_dir as clone_dir
import pycwb.cli.batch_runner as batch_runner
import pycwb.cli.xtalk as xtalk
import pycwb.cli.merge_catalog as merge_catalog
import pycwb.cli.post_process as post_process
import pycwb.cli.gwosc as gwosc
import pycwb.cli.gwosc_data as gwosc_data
import pycwb.cli.get_external_modules as get_external_modules
import pycwb.cli.run_waveform_reconstruction as run_waveform_reconstruction
import pycwb.cli.online as online
import pycwb.cli.progress as progress
import pycwb.cli.simulation_summary as simulation_summary
import pycwb.cli.match_simulations as match_simulations
from pycwb import __version__

def main():
    parser = argparse.ArgumentParser(prog='pycwb')
    subparsers = parser.add_subparsers(help='commands')

    # Show version
    parser.add_argument('-v', '--version', action='version', version=f'pycwb {__version__}')

    # Create subcommand
    create_parser = subparsers.add_parser('server', help='Run a simple server to show the results')
    server.init_parser(create_parser)
    create_parser.set_defaults(func=server.command)

    # Run subcommand
    run_parser = subparsers.add_parser('run', help='Run search')
    run.init_parser(run_parser)
    run_parser.set_defaults(func=run.command)

    flow_parser = subparsers.add_parser('flow', help='Run search')
    flow.init_parser(flow_parser)
    flow_parser.set_defaults(func=flow.command)

    batch_parser = subparsers.add_parser('batch-setup', help='Setup batch run')
    batch_setup.init_parser(batch_parser)
    batch_parser.set_defaults(func=batch_setup.command)

    config_setup_parser = subparsers.add_parser('config-setup', help='Setup project configuration and submit batch job')
    config_setup.init_parser(config_setup_parser)
    config_setup_parser.set_defaults(func=config_setup.command)

    clone_dir_parser = subparsers.add_parser('clone-dir', help='Clone a directory to a new location')
    clone_dir.init_parser(clone_dir_parser)
    clone_dir_parser.set_defaults(func=clone_dir.command)

    batch_runner_parser = subparsers.add_parser('batch-runner', help='Runner for batch run')
    batch_runner.init_parser(batch_runner_parser)
    batch_runner_parser.set_defaults(func=batch_runner.command)

    xtalk_parser = subparsers.add_parser('xtalk', help='Convert xtalk file')
    xtalk.init_parser(xtalk_parser)
    xtalk_parser.set_defaults(func=xtalk.command)

    merge_catalog_parser = subparsers.add_parser('merge', help='Merge catalog or wave files')
    merge_catalog.init_parser(merge_catalog_parser)
    merge_catalog_parser.set_defaults(func=merge_catalog.command)

    post_process_parser = subparsers.add_parser('post-process', help='Post process the results')
    post_process.init_parser(post_process_parser)
    post_process_parser.set_defaults(func=post_process.command)

    waveform_reconstruction_parser = subparsers.add_parser('waveform-reconstruction', help='Run waveform reconstruction analysis')
    run_waveform_reconstruction.init_parser(waveform_reconstruction_parser)
    waveform_reconstruction_parser.set_defaults(func=run_waveform_reconstruction.command)

    # gwosc subcommand
    gwosc_parser = subparsers.add_parser('gwosc', help='Download files to run a pycwb analysis of a GW event of your choice')
    gwosc.init_parser(gwosc_parser)
    gwosc_parser.set_defaults(func=gwosc.command)

    # gwosc_data subcommand
    gwosc_data_parser = subparsers.add_parser('gwosc-data', help='Download data files to run a pycwb analysis with user parameters')
    gwosc_data.init_parser(gwosc_data_parser)
    gwosc_data_parser.set_defaults(func=gwosc_data.command)

    # get_external_modules subcommand
    get_external_modules_parser = subparsers.add_parser('get-external-modules', help='Get external modules')
    get_external_modules.init_parser(get_external_modules_parser)
    get_external_modules_parser.set_defaults(func=get_external_modules.command)

    # online subcommand
    online_parser = subparsers.add_parser('online', help='Run online gravitational-wave search')
    online.init_parser(online_parser)
    online_parser.set_defaults(func=online.command)

    # progress subcommand
    progress_parser = subparsers.add_parser(
        'progress',
        help='Show run progress from catalog/progress Parquet files',
    )
    progress.init_parser(progress_parser)
    progress_parser.set_defaults(func=progress.command)

    # simulation-summary subcommand
    sim_summary_parser = subparsers.add_parser(
        'simulation-summary',
        help='Build a per-simulation summary Parquet file with veto flags',
    )
    simulation_summary.init_parser(sim_summary_parser)
    sim_summary_parser.set_defaults(func=simulation_summary.command)

    # match-simulations subcommand
    match_sims_parser = subparsers.add_parser(
        'match-simulations',
        help='Match a trigger catalog to a simulation summary via interval join',
    )
    match_simulations.init_parser(match_sims_parser)
    match_sims_parser.set_defaults(func=match_simulations.command)

    args = parser.parse_args()
    if hasattr(args, 'func'):
        args.func(args)
    else:
        parser.print_help()

    # if no command is given, print help
    if len(vars(args)) == 0:
        parser.print_help()


if __name__ == '__main__':
    main()
