"""Clean a raw file from EOG and ECG artifacts with PCA (ie SSP).

Examples
--------
.. code-block:: console

    $ mne clean_eog_ecg -i in_raw.fif -o clean_raw.fif -e -c

"""

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

import sys

import mne


def clean_ecg_eog(
    in_fif_fname,
    out_fif_fname=None,
    eog=True,
    ecg=True,
    ecg_proj_fname=None,
    eog_proj_fname=None,
    ecg_event_fname=None,
    eog_event_fname=None,
    in_path=".",
    quiet=False,
):
    """Clean ECG from raw fif file.

    Parameters
    ----------
    in_fif_fname : path-like
        Raw fif File
    eog_event_fname : str
        name of EOG event file required.
    eog : bool
        Reject or not EOG artifacts.
    ecg : bool
        Reject or not ECG artifacts.
    ecg_event_fname : str
        name of ECG event file required.
    in_path : str
        Path where all the files are.
    """
    if not eog and not ecg:
        raise Exception("EOG and ECG cannot be both disabled")

    # Reading fif File
    raw_in = mne.io.read_raw_fif(in_fif_fname)

    if in_fif_fname.endswith("_raw.fif") or in_fif_fname.endswith("-raw.fif"):
        prefix = in_fif_fname[:-8]
    else:
        prefix = in_fif_fname[:-4]

    if out_fif_fname is None:
        out_fif_fname = prefix + "_clean_ecg_eog_raw.fif"
    if ecg_proj_fname is None:
        ecg_proj_fname = prefix + "_ecg-proj.fif"
    if eog_proj_fname is None:
        eog_proj_fname = prefix + "_eog-proj.fif"
    if ecg_event_fname is None:
        ecg_event_fname = prefix + "_ecg-eve.fif"
    if eog_event_fname is None:
        eog_event_fname = prefix + "_eog-eve.fif"

    print("Implementing ECG and EOG artifact rejection on data")

    kwargs = dict() if quiet else dict(stdout=None, stderr=None)
    if ecg:
        ecg_events, _, _ = mne.preprocessing.find_ecg_events(
            raw_in, reject_by_annotation=True
        )
        print(f"Writing ECG events in {ecg_event_fname}")
        mne.write_events(ecg_event_fname, ecg_events)
        print("Computing ECG projector")
        command = (
            "mne_process_raw",
            "--cd",
            in_path,
            "--raw",
            in_fif_fname,
            "--events",
            ecg_event_fname,
            "--makeproj",
            "--projtmin",
            "-0.08",
            "--projtmax",
            "0.08",
            "--saveprojtag",
            "_ecg-proj",
            "--projnmag",
            "2",
            "--projngrad",
            "1",
            "--projevent",
            "999",
            "--highpass",
            "5",
            "--lowpass",
            "35",
            "--projmagrej",
            "4000",
            "--projgradrej",
            "3000",
        )
        mne.utils.run_subprocess(command, **kwargs)
    if eog:
        eog_events = mne.preprocessing.find_eog_events(raw_in)
        print(f"Writing EOG events in {eog_event_fname}")
        mne.write_events(eog_event_fname, eog_events)
        print("Computing EOG projector")
        command = (
            "mne_process_raw",
            "--cd",
            in_path,
            "--raw",
            in_fif_fname,
            "--events",
            eog_event_fname,
            "--makeproj",
            "--projtmin",
            "-0.15",
            "--projtmax",
            "0.15",
            "--saveprojtag",
            "_eog-proj",
            "--projnmag",
            "2",
            "--projngrad",
            "2",
            "--projevent",
            "998",
            "--lowpass",
            "35",
            "--projmagrej",
            "4000",
            "--projgradrej",
            "3000",
        )
        mne.utils.run_subprocess(command, **kwargs)

    if out_fif_fname is not None:
        # Applying the ECG EOG projector
        print("Applying ECG EOG projector")
        command = (
            "mne_process_raw",
            "--cd",
            in_path,
            "--raw",
            in_fif_fname,
            "--proj",
            in_fif_fname,
            "--projoff",
            "--save",
            out_fif_fname,
            "--filteroff",
            "--proj",
            ecg_proj_fname,
            "--proj",
            eog_proj_fname,
        )
        mne.utils.run_subprocess(command, **kwargs)
        print("Done removing artifacts.")
        print(f"Cleaned raw data saved in: {out_fif_fname}")
        print("IMPORTANT : Please eye-ball the data !!")
    else:
        print("Projection not applied to raw data.")


def run():
    """Run command."""
    from mne.commands.utils import get_optparser

    parser = get_optparser(__file__)

    parser.add_option(
        "-i", "--in", dest="raw_in", help="Input raw FIF file", metavar="FILE"
    )
    parser.add_option(
        "-o",
        "--out",
        dest="raw_out",
        help="Output raw FIF file",
        metavar="FILE",
        default=None,
    )
    parser.add_option(
        "-e",
        "--no-eog",
        dest="eog",
        action="store_false",
        help="Remove EOG",
        default=True,
    )
    parser.add_option(
        "-c",
        "--no-ecg",
        dest="ecg",
        action="store_false",
        help="Remove ECG",
        default=True,
    )
    parser.add_option(
        "-q",
        "--quiet",
        dest="quiet",
        action="store_true",
        help="Suppress mne_process_raw output",
        default=False,
    )

    options, args = parser.parse_args()

    if options.raw_in is None:
        parser.print_help()
        sys.exit(1)

    raw_in = options.raw_in
    raw_out = options.raw_out
    eog = options.eog
    ecg = options.ecg
    quiet = options.quiet

    clean_ecg_eog(raw_in, raw_out, eog=eog, ecg=ecg, quiet=quiet)


mne.utils.run_command_if_main()
