"""Test enter"""

import os

import pytest


@pytest.mark.parametrize(
    "shell, success",
    [
        ("delete", True),  # if there is no shell variable, bash creates it
        ("", False),
        ("/usr/bin/env", True),
        ("noexec", False),
    ],
    ids=[
        "shell-missing",
        "shell-empty",
        "shell-env",
        "shell-noexec",
    ],
)
@pytest.mark.usefixtures("ds1_copy")
def test_enter(runner, yadm_cmd, paths, shell, success):
    """Enter tests"""
    env = os.environ.copy()
    if shell == "delete":
        # remove shell
        if "SHELL" in env:
            del env["SHELL"]
    elif shell == "noexec":
        # specify a non-executable path
        noexec = paths.root.join("noexec")
        noexec.write("")
        noexec.chmod(0o664)
        env["SHELL"] = str(noexec)
    else:
        env["SHELL"] = shell

    run = runner(command=yadm_cmd("enter"), env=env)
    assert run.success == success
    prompt = f"yadm shell ({paths.repo})"
    if success:
        assert run.out.startswith("Entering yadm repo")
        assert run.out.rstrip().endswith("Leaving yadm repo")
        assert run.err == ""
    else:
        assert "does not refer to an executable" in run.err
    if "env" in shell:
        assert f"GIT_DIR={paths.repo}" in run.out
        assert f"GIT_WORK_TREE={paths.work}" in run.out
        assert f"PROMPT={prompt}" in run.out
        assert f"PS1={prompt}" in run.out


@pytest.mark.parametrize(
    "shell, opts, path",
    [
        ("bash", "--norc", "\\w"),
        ("csh", "-f", "%~"),
        ("zsh", "-f", "%~"),
    ],
    ids=[
        "bash",
        "csh",
        "zsh",
    ],
)
@pytest.mark.parametrize(
    "cmd",
    [False, "cmd", "cmd-bad-exit"],
    ids=["no-cmd", "cmd", "cmd-bad-exit"],
)
@pytest.mark.parametrize(
    "term",
    ["", "dumb"],
    ids=["term-empty", "term-dumb"],
)
@pytest.mark.usefixtures("ds1_copy")
def test_enter_shell_ops(runner, yadm_cmd, paths, shell, opts, path, cmd, term):
    """Enter tests for specific shell options"""

    change_exit = "\nfalse" if cmd == "cmd-bad-exit" else ""

    # Create custom shell to detect options passed
    custom_shell = paths.root.join(shell)
    custom_shell.write(f"#!/bin/sh\necho OPTS=$*\necho PROMPT=$PROMPT{change_exit}")
    custom_shell.chmod(0o775)

    test_cmd = ["test1", "test2", "test3"]

    enter_cmd = ["enter"]
    if cmd:
        enter_cmd += test_cmd

    env = os.environ.copy()
    env["TERM"] = term
    env["SHELL"] = custom_shell

    if shell == "zsh" and term == "dumb":
        opts += " --no-zle"

    run = runner(command=yadm_cmd(*enter_cmd), env=env)
    if cmd == "cmd-bad-exit":
        assert run.failure
    else:
        assert run.success
    assert run.err == ""
    assert f"OPTS={opts}" in run.out
    assert f"PROMPT=yadm shell ({paths.repo}) {path} >" in run.out
    if cmd:
        assert "-c " + " ".join(test_cmd) in run.out
        assert "Entering yadm repo" not in run.out
        assert "Leaving yadm repo" not in run.out
    else:
        assert "Entering yadm repo" in run.out
        assert "Leaving yadm repo" in run.out
