from io import StringIO
from contextlib import redirect_stdout, redirect_stderr
import pytest


from tiramisu_cmdline_parser import TiramisuCmdlineParser
from tiramisu import IntOption, StrOption, BoolOption, ChoiceOption, \
                     OptionDescription, Config
try:
    from tiramisu_api import Config as JsonConfig
    #params = ['tiramisu', 'tiramisu-json']
    params = ['tiramisu']
except:
    params = ['tiramisu']
from .utils import TestHelpFormatter, to_dict


def get_config(json, has_tree=False, default_verbosity=False, add_long=False, add_store_false=False):
    choiceoption = ChoiceOption('cmd',
                                'choice the sub argument',
                                ('str', 'list', 'int', 'none'),
                                properties=('mandatory',))
    booloption = BoolOption('verbosity',
                            'increase output verbosity',
                            default=default_verbosity,
                            )
    str_ = StrOption('str',
                     'string option',
                     default='default'
                     )
    list_ = StrOption('list',
                      'list string option',
                      multi=True,
                      default=['default'],
                      )
    int_ = IntOption('int',
                     'int option',
                     default=10,
                     )

    root = OptionDescription('root',
                             'root',
                             [choiceoption,
                             booloption,
                             str_,
                             list_,
                             int_
                             ])
    if has_tree:
        root = OptionDescription('root',
                                 'root',
                                 [root])
    config = Config(root)
    config.property.read_write()
    if add_store_false:
        config.option('verbosity').property.add('storefalse')
    if add_long:
        config.option('verbosity').property.add('longargument')
    if json == 'tiramisu':
        return config
    jconfig = JsonConfig(config.option.dict())
    return jconfig


@pytest.fixture(params=params)
def json(request):
    return request.param


def test_readme_help(json):
    output = """usage: prog.py [-h] --cmd {str,list,int,none} [--verbosity] [--no-verbosity] [--str [STR]] [--list [LIST ...]] [--int [INT]]

options:
  -h, --help            show this help message and exit
  --cmd {str,list,int,none}
                        choice the sub argument
  --verbosity           increase output verbosity (default: False)
  --no-verbosity
  --str [STR]           string option (default: default)
  --list [LIST ...]     list string option (default: default)
  --int [INT]           int option (default: 10)
"""
    parser = TiramisuCmdlineParser(get_config(json), 'prog.py', formatter_class=TestHelpFormatter)
    f = StringIO()
    with redirect_stdout(f):
        parser.print_help()
    assert f.getvalue() == output


def test_readme_help2(json):
    output = """usage: prog.py [-h] --cmd {str,list,int,none} [--verbosity] [--no-verbosity] [--str [STR]] [--list [LIST ...]] [--int [INT]]

options:
  -h, --help            show this help message and exit
  --cmd {str,list,int,none}
                        choice the sub argument
  --verbosity           increase output verbosity (default: True)
  --no-verbosity
  --str [STR]           string option (default: default)
  --list [LIST ...]     list string option (default: default)
  --int [INT]           int option (default: 10)
"""
    parser = TiramisuCmdlineParser(get_config(json, default_verbosity=True), 'prog.py', formatter_class=TestHelpFormatter)
    f = StringIO()
    with redirect_stdout(f):
        parser.print_help()
    assert f.getvalue() == output