r"""Browse raw data.

This uses :func:`mne.io.read_raw` so it supports the same formats
(without keyword arguments).

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

    $ mne browse_raw sample_audvis_raw.fif \
                     --proj sample_audvis_ecg-proj.fif \
                     --eve sample_audvis_raw-eve.fif
"""

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

import sys

import mne


def run():
    """Run command."""
    from mne.commands.utils import _add_verbose_flag, get_optparser
    from mne.viz import _RAW_CLIP_DEF

    parser = get_optparser(__file__, usage="usage: %prog raw [options]")

    parser.add_option(
        "--raw",
        dest="raw_in",
        help="Input raw FIF file (can also be specified "
        "directly as an argument without the --raw prefix)",
        metavar="FILE",
    )
    parser.add_option(
        "--proj", dest="proj_in", help="Projector file", metavar="FILE", default=""
    )
    parser.add_option(
        "--projoff",
        dest="proj_off",
        help="Disable all projectors",
        default=False,
        action="store_true",
    )
    parser.add_option(
        "--eve", dest="eve_in", help="Events file", metavar="FILE", default=""
    )
    parser.add_option(
        "-d",
        "--duration",
        dest="duration",
        type="float",
        help="Time window for plotting (s)",
        default=10.0,
    )
    parser.add_option(
        "-t",
        "--start",
        dest="start",
        type="float",
        help="Initial start time for plotting",
        default=0.0,
    )
    parser.add_option(
        "-n",
        "--n_channels",
        dest="n_channels",
        type="int",
        help="Number of channels to plot at a time",
        default=20,
    )
    parser.add_option(
        "-o",
        "--order",
        dest="group_by",
        help="Order to use for grouping during plotting ('type' or 'original')",
        default="type",
    )
    parser.add_option(
        "-p",
        "--preload",
        dest="preload",
        help="Preload raw data (for faster navigation)",
        default=False,
        action="store_true",
    )
    parser.add_option(
        "-s",
        "--show_options",
        dest="show_options",
        help="Show projection options dialog",
        default=False,
    )
    parser.add_option(
        "--allowmaxshield",
        dest="maxshield",
        help="Allow loading MaxShield processed data",
        action="store_true",
    )
    parser.add_option(
        "--highpass",
        dest="highpass",
        type="float",
        help="Display high-pass filter corner frequency",
        default=-1,
    )
    parser.add_option(
        "--lowpass",
        dest="lowpass",
        type="float",
        help="Display low-pass filter corner frequency",
        default=-1,
    )
    parser.add_option(
        "--filtorder",
        dest="filtorder",
        type="int",
        help="Display filtering IIR order (or 0 to use FIR)",
        default=4,
    )
    parser.add_option(
        "--clipping",
        dest="clipping",
        help="Enable trace clipping mode. Can be 'clamp', 'transparent', a float, "
        "or 'none'.",
        default=_RAW_CLIP_DEF,
    )
    parser.add_option(
        "--filterchpi",
        dest="filterchpi",
        help="Enable filtering cHPI signals.",
        default=None,
        action="store_true",
    )
    parser.add_option(
        "--butterfly",
        dest="butterfly",
        help="Plot in butterfly mode",
        default=False,
        action="store_true",
    )
    _add_verbose_flag(parser)
    options, args = parser.parse_args()

    if len(args):
        raw_in = args[0]
    else:
        raw_in = options.raw_in
    duration = options.duration
    start = options.start
    n_channels = options.n_channels
    group_by = options.group_by
    preload = options.preload
    show_options = options.show_options
    proj_in = options.proj_in
    proj_off = options.proj_off
    eve_in = options.eve_in
    maxshield = options.maxshield
    highpass = options.highpass
    lowpass = options.lowpass
    filtorder = options.filtorder
    clipping = options.clipping
    if isinstance(clipping, str):
        if clipping.lower() == "none":
            clipping = None
        else:
            try:
                clipping = float(clipping)  # allow float and convert it
            except ValueError:
                pass
    filterchpi = options.filterchpi
    verbose = options.verbose
    butterfly = options.butterfly

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

    kwargs = dict(preload=preload)
    if maxshield:
        kwargs.update(allow_maxshield="yes")
    raw = mne.io.read_raw(raw_in, **kwargs)
    if len(proj_in) > 0:
        projs = mne.read_proj(proj_in)
        raw.info["projs"] = projs
    if len(eve_in) > 0:
        events = mne.read_events(eve_in)
    else:
        events = None

    if filterchpi:
        if not preload:
            raise RuntimeError("Raw data must be preloaded for chpi, use --preload")
        raw = mne.chpi.filter_chpi(raw)

    highpass = None if highpass < 0 or filtorder < 0 else highpass
    lowpass = None if lowpass < 0 or filtorder < 0 else lowpass
    raw.plot(
        duration=duration,
        start=start,
        n_channels=n_channels,
        group_by=group_by,
        show_options=show_options,
        events=events,
        highpass=highpass,
        lowpass=lowpass,
        filtorder=filtorder,
        clipping=clipping,
        butterfly=butterfly,
        proj=not proj_off,
        verbose=verbose,
        show=True,
        block=True,
    )


mne.utils.run_command_if_main()
