'''
:copyright: (c) 2021, Alliance for Sustainable Energy, LLC
:license: BSD-3
'''
import pytest
import shutil
from pathlib import Path
import logging
from layerstack import ArgMode, LayerStackError, Layer, Stack
from layerstack.tests import layer_library_dir, outdir
from layerstack.stack import repoint_stack, parse_args_helper
import subprocess
from subprocess import Popen, PIPE
logger = logging.getLogger(__name__)
[docs]def test_layer_types():
    layer = Layer(layer_library_dir / 'test_list_args')
    with pytest.raises(LayerStackError) as excinfo:
        Stack(layers = [layer, 1])
    assert 'int' in str(excinfo.value), str(excinfo.value)
    with pytest.raises(LayerStackError):
        Stack(layers = [layer.layer_dir]) 
[docs]def test_basic_compose_and_run():
    layer = Layer(layer_library_dir / 'test_list_args')
    stack = Stack(layers = [layer], 
                  name='Basic Test', 
                  run_dir = outdir / 'test_basic_compose_and_run')
    stack.set_arg_mode(ArgMode.USE)
    stack[0].args[0] = [1, 2, 3]
    stack.run() 
[docs]def test_get_layer_dir():
    alt_layer_library_dir = outdir / 'test_get_layer_dir'
    alt_layer_library_dir.mkdir()
    orig_layer_dir = layer_library_dir / 'test_list_args' 
    new_layer_dir = alt_layer_library_dir / 'test_list_args'
    shutil.copytree(orig_layer_dir, new_layer_dir)
    test_layer_dir = Stack.get_layer_dir(
        orig_layer_dir, 
        layer_library_dirs=[alt_layer_library_dir], 
        original_preferred=True)
    assert test_layer_dir == orig_layer_dir
    test_layer_dir = Stack.get_layer_dir(
        orig_layer_dir, 
        layer_library_dirs=[alt_layer_library_dir], 
        original_preferred=False)
    assert test_layer_dir == new_layer_dir
    fake_layer_dir = layer_library_dir / 'my_nonexistent_layer'
    test_layer_dir = Stack.get_layer_dir(
        fake_layer_dir, 
        layer_library_dirs=[alt_layer_library_dir], 
        original_preferred=True)
    assert test_layer_dir is None 
# *** create new stack and test repointing ***
[docs]def test_repointing_run_dir():
    
    stack_library_dir = outdir / 'test_stack_repoint'
    if not stack_library_dir.exists():
        stack_library_dir.mkdir()
    layer = Layer(layer_library_dir / 'test_list_args')
    stack = Stack(layers = [layer], 
                  name='Basic Test', 
                  run_dir = outdir / 'test_basic_repoint')
    
    p = stack_library_dir / 'test_stack_repoint_layer_1.json'
    stack.save(p)
    assert stack.run_dir is not None
    new_run_dir = outdir / 'new_run_dir'
    repoint_stack(p, run_dir = new_run_dir)
    np = stack_library_dir / '_test_stack_repoint_layer_1.json'
    check_stack = Stack.load(np)
    assert str(check_stack.run_dir) == str(new_run_dir)  
[docs]def test_parser():
    cli_arg_list = ['test_hw_amc_5min_simple.json', 'run', '-sp', str(outdir)]
    args = parse_args_helper(cli_arg_list)
    assert args.stack_file == 'test_hw_amc_5min_simple.json'
    assert args.mode == 'run'
    assert args.save_path == str(outdir)
    assert args.layer_library_dirs == None
    assert args.original_locations_preferred == True
    assert args.debug == False
    assert args.warning_only == False
    assert args.archive == True