"""
Read hippocampal subfield volumes computed by Freesurfer and/or ASHS
and export collected data as CSV.
"""

import argparse
import os
import re
import sys

import pandas

from freesurfer_volume_reader import (
    __version__,
    ashs,
    freesurfer,
    remove_group_names_from_regex,
)

VOLUME_FILE_FINDERS = {
    "ashs": ashs.HippocampalSubfieldsVolumeFile,
    # https://github.com/freesurfer/freesurfer/tree/release_6_0_0/HippoSF
    "freesurfer-hipposf": freesurfer.HippocampalSubfieldsVolumeFile,
}


def main():
    argparser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    argparser.add_argument(
        "--source-types",
        nargs="+",
        default=["freesurfer-hipposf"],
        choices=VOLUME_FILE_FINDERS.keys(),
        help="default: [freesurfer-hipposf]",
    )
    for source_type, file_class in VOLUME_FILE_FINDERS.items():
        argparser.add_argument(
            f"--{source_type}-filename-regex",
            dest=f"filename_regex.{source_type}",
            metavar="REGULAR_EXPRESSION",
            type=re.compile,
            default=remove_group_names_from_regex(file_class.FILENAME_PATTERN),
            help="default: %(default)s",
        )
    argparser.add_argument(
        "--output-format", choices=["csv"], default="csv", help="default: %(default)s"
    )
    subjects_dir_path = os.environ.get("SUBJECTS_DIR", None)
    argparser.add_argument(
        "root_dir_paths",
        metavar="ROOT_DIR",
        nargs="*" if subjects_dir_path else "+",
        default=[subjects_dir_path],
        help=f"default: $SUBJECTS_DIR ({subjects_dir_path})",
    )
    argparser.add_argument("--version", action="version", version=__version__)
    args = argparser.parse_args()
    filename_regexs = {
        k[len("filename_regex.") :]: v
        for k, v in vars(args).items()
        if k.startswith("filename_regex.")
    }
    volume_frames = []
    for source_type in args.source_types:
        finder = VOLUME_FILE_FINDERS[source_type]
        for root_dir_path in args.root_dir_paths:
            for volume_file in finder.find(
                root_dir_path=root_dir_path, filename_regex=filename_regexs[source_type]
            ):
                volume_frame = volume_file.read_volumes_dataframe()
                volume_frame["source_type"] = source_type
                volume_frame["source_path"] = volume_file.absolute_path
                volume_frames.append(volume_frame)
    if not volume_frames:
        print(
            "Did not find any volume files matching the specified criteria.",
            file=sys.stderr,
        )
        return os.EX_NOINPUT
    united_volume_frame = pandas.concat(volume_frames, ignore_index=True, sort=False)
    print(united_volume_frame.to_csv(index=False))
    return os.EX_OK


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