"""Utility for changing directories and execution of commands in a subshell."""
from __future__ import print_function

import os
import shlex
import subprocess

# Store the previous working directory for the 'cd -' command.


class Holder:
    """Holds the _prev_dir_ class attribute for chdir() function."""
    _prev_dir_ = None

    @classmethod
    def prev_dir(cls):
        return cls._prev_dir_

    @classmethod
    def swap(cls, dir):
        cls._prev_dir_ = dir


def chdir(debugger, args, result, dict):
    """Change the working directory, or cd to ${HOME}.
    You can also issue 'cd -' to change to the previous working directory."""
    new_dir = args.strip()
    if not new_dir:
        new_dir = os.path.expanduser('~')
    elif new_dir == '-':
        if not Holder.prev_dir():
            # Bad directory, not changing.
            print("bad directory, not changing")
            return
        else:
            new_dir = Holder.prev_dir()

    Holder.swap(os.getcwd())
    os.chdir(new_dir)
    print("Current working directory: %s" % os.getcwd())


def system(debugger, command_line, result, dict):
    """Execute the command (a string) in a subshell."""
    args = shlex.split(command_line)
    process = subprocess.Popen(
        args,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
    output, error = process.communicate()
    retcode = process.poll()
    if output and error:
        print("stdout=>\n", output)
        print("stderr=>\n", error)
    elif output:
        print(output)
    elif error:
        print(error)
    print("retcode:", retcode)
