# Authors: The MNE-Python contributors.
# License: BSD-3-Clause
# Copyright the MNE-Python contributors.

from pathlib import Path

from ...utils import _check_option, _validate_type, get_subjects_dir, verbose
from ..utils import _manifest_check_download

_AGES = "2wk 1mo 2mo 3mo 4.5mo 6mo 7.5mo 9mo 10.5mo 12mo 15mo 18mo 2yr"
# https://github.com/christian-oreilly/infant_template_paper/releases
_ORIGINAL_URL = "https://github.com/christian-oreilly/infant_template_paper/releases/download/v0.1-alpha/{subject}.zip"  # noqa: E501
# Formatted the same way as md5sum *.zip on Ubuntu:
_ORIGINAL_HASHES = """
851737d5f8f246883f2aef9819c6ec29  ANTS10-5Months3T.zip
32ab6d025f4311433a82e81374f1a045  ANTS1-0Months3T.zip
48ef349e7cc542fdf63ff36d7958ab57  ANTS12-0Months3T.zip
bba22c95aa97988c6e8892d6169ed317  ANTS15-0Months3T.zip
e1bfe5e3ef380592822ced446a4008c7  ANTS18-0Months3T.zip
fa7bee6c0985b9cd15ba53820cd72ccd  ANTS2-0Months3T.zip
2ad90540cdf42837c09f8ce829458a35  ANTS2-0Weeks3T.zip
73e6a8b2579b7959a96f7d294ffb7393  ANTS2-0Years3T.zip
cb7b9752894e16a4938ddfe220f6286a  ANTS3-0Months3T.zip
16b2a6804c7d5443cfba2ad6f7d4ac6a  ANTS4-5Months3T.zip
dbdf2a9976121f2b106da96775690da3  ANTS6-0Months3T.zip
75fe37a1bc80ed6793a8abb47681d5ab  ANTS7-5Months3T.zip
790f7dba0a264262e6c1c2dfdf216215  ANTS9-0Months3T.zip
"""
_MANIFEST_PATH = Path(__file__).parent


@verbose
def fetch_infant_template(age, subjects_dir=None, *, verbose=None):
    """Fetch and update an infant MRI template.

    Parameters
    ----------
    age : str
        Age to download. Can be one of ``{'2wk', '1mo', '2mo', '3mo', '4.5mo',
        '6mo', '7.5mo', '9mo', '10.5mo', '12mo', '15mo', '18mo', '2yr'}``.
    subjects_dir : str | None
        The path to download the template data to.
    %(verbose)s

    Returns
    -------
    subject : str
        The standard subject name, e.g. ``ANTS4-5Month3T``.

    Notes
    -----
    If you use these templates in your work, please cite
    :footcite:`OReillyEtAl2021` and :footcite:`RichardsEtAl2016`.

    .. versionadded:: 0.23

    References
    ----------
    .. footbibliography::
    """
    # Code used to create the lists:
    #
    # $ for name in 2-0Weeks 1-0Months 2-0Months 3-0Months 4-5Months 6-0Months 7-5Months 9-0Months 10-5Months 12-0Months 15-0Months 18-0Months 2-0Years; do wget https://github.com/christian-oreilly/infant_template_paper/releases/download/v0.1-alpha/ANTS${name}3T.zip; done  # noqa: E501
    # $ md5sum ANTS*.zip
    # $ python
    # >>> import os.path as op
    # >>> import zipfile
    # >>> names = [f'ANTS{name}3T' for name in '2-0Weeks 1-0Months 2-0Months 3-0Months 4-5Months 6-0Months 7-5Months 9-0Months 10-5Months 12-0Months 15-0Months 18-0Months 2-0Years'.split()]  # noqa: E501
    # >>> for name in names:
    # ...     with zipfile.ZipFile(f'{name}.zip', 'r') as zip:
    # ...         names = sorted(name for name in zip.namelist() if not zipfile.Path(zip, name).is_dir())  # noqa: E501
    # ...     with open(f'{name}.txt', 'w') as fid:
    # ...         fid.write('\n'.join(names))
    _validate_type(age, str, "age")
    _check_option("age", age, _AGES.split())
    subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
    unit = dict(wk="Weeks", mo="Months", yr="Years")[age[-2:]]
    first = age[:-2].split(".")[0]
    dash = "-5" if ".5" in age else "-0"
    subject = f"ANTS{first}{dash}{unit}3T"
    # Actually get and create the files
    subject_dir = subjects_dir / subject
    subject_dir.mkdir(parents=True, exist_ok=True)
    # .zip -> hash mapping
    orig_hashes = dict(
        line.strip().split()[::-1] for line in _ORIGINAL_HASHES.strip().splitlines()
    )
    _manifest_check_download(
        manifest_path=_MANIFEST_PATH / f"{subject}.txt",
        destination=subject_dir,
        url=_ORIGINAL_URL.format(subject=subject),
        hash_=orig_hashes[f"{subject}.zip"],
    )
    return subject
