#!/usr/bin/env python3
import argparse

import spatialprofilingtoolbox as spt


if __name__=='__main__':
    parser = argparse.ArgumentParser(
        description = ''.join([
            'The entry point into SPT (Spatial Profiling Toolbox) ',
            'commands.',
        ])
    )
    generate_jobs = 'generate-jobs'
    list_auxiliary_job_inputs = 'list-auxiliary-job-inputs'
    configure = 'configure'
    single_job = 'single-job'
    aggregate_results = 'aggregate-results'
    parser.add_argument(
        'command_token',
        nargs='?',
        choices = [generate_jobs, list_auxiliary_job_inputs, configure, single_job, aggregate_results],
    )
    parser.add_argument('--input-file-identifier',
        dest='input_file_identifier',
        type=str,
        required=False,
        help='An input file identifier, as it appears in the file manifest.',
    )
    parser.add_argument('--fov',
        dest='fov_index',
        type=int,
        required=False,
        help=''.join([
            'Indication of field of view to consider (one-based integer ',
            'index). Only pertains to some workflows.',
        ])
    )
    parser.add_argument('--job-inputs',
        dest='job_inputs',
        type=str,
        required=False,
        help=''.join([
            'Filename for output list of additional inputs to every job.',
        ])
    )
    parser.add_argument('--intermediate-database-filename',
        dest='intermediate_database_filename',
        type=str,
        required=False,
        help=''.join([
            'Filename for sqlite database file storing intermediate results.',
        ])
    )
    args = parser.parse_args()
    parameters = {}
    value = args.input_file_identifier
    if value is not None:
        parameters['input_file_identifier'] = value
    value = args.fov_index
    if value is not None:
        parameters['fov_index'] = value
    value = args.job_inputs
    if value is not None:
        parameters['job_inputs'] = value
    value = args.intermediate_database_filename
    if value is not None:
        parameters['intermediate_database_filename'] = value

    command = args.command_token
    if command == configure:
        spt.configuration_dialog()

    parameters = {**parameters, **spt.get_config_parameters()}

    if command == list_auxiliary_job_inputs:
        job_generator = spt.get_job_generator(**parameters)
        job_generator.list_auxiliary_job_inputs()

    if command == generate_jobs:
        job_generator = spt.get_job_generator(**parameters)
        job_generator.generate()

    if command == single_job:
        analyzer = spt.get_analyzer(**parameters)
        analyzer.calculate()

    if command == aggregate_results:
        integrator = spt.get_integrator(**parameters)
        integrator.calculate()
