import pytest

import textwrap

from semantic_version import Spec

from solc import get_solc_version
from solc.main import solc_supports_standard_json_interface


@pytest.fixture()
def contracts_dir(tmpdir):
    return str(tmpdir.mkdir("contracts"))


@pytest.fixture(scope="session")
def solc_version():
    return get_solc_version()


@pytest.fixture()
def supported_solc_version(solc_version):
    if solc_version not in Spec('>=0.4.1,<=0.4.25,!=0.4.10,!=0.4.3,!=0.4.4,!=0.4.5'):
        raise AssertionError("Unsupported compiler version: {0}".format(solc_version))

    return solc_version


@pytest.fixture()
def is_new_key_format():
    return get_solc_version() in Spec('>=0.4.9')


@pytest.fixture()
def FOO_SOURCE(supported_solc_version, solc_version):
    if solc_version in Spec('<0.4.17'):
        return textwrap.dedent('''\
            pragma solidity ^0.4.0;

            contract Foo {
                function Foo() {}

                function return13() public returns (uint) {
                    return 13;
                }
            }
            ''')
    else:
        return textwrap.dedent('''\
            pragma solidity ^0.4.17;

            contract Foo {
                function Foo() public {}

                function return13() public pure returns (uint) {
                    return 13;
                }
            }
            ''')


@pytest.fixture()
def BAR_SOURCE(supported_solc_version):
    return textwrap.dedent('''\
        pragma solidity ^0.4.0;

        contract Bar {
            function Bar() public {}
        }
        ''')


@pytest.fixture()
def BAZ_SOURCE(supported_solc_version):
    return textwrap.dedent('''\
        pragma solidity ^0.4.0;

        import "contracts/Bar.sol";

        contract Baz is Bar {
            function Baz() public {}

            function get_funky() public returns (string) {
                return "funky";
            }
        }
        ''')


@pytest.fixture()
def INVALID_SOURCE(supported_solc_version):
    return textwrap.dedent('''\
        pragma solidity ^0.4.0;
        contract Foo {
        ''')


def pytest_runtest_setup(item):
    if (item.get_marker('requires_standard_json') is not None and
        not solc_supports_standard_json_interface()):
        pytest.skip('requires `--standard-json` support')