'''
Library to handle the manipulation and generation of CWL tool
'''

#  Import  ------------------------------

# General libraries
import os
import six
import logging

# External libraries
import ruamel.yaml as ryaml
import cwlgen

logging.basicConfig(level=logging.INFO)
_LOGGER = logging.getLogger(__name__)

#  Class(es)  ------------------------------


def parse_cwl(cwl_path):
    """
    Method that parses a CWL file and will a
    :class:`cwlgen.Workflow` or :class:`cwlgen.CommandLineTool`.
    Note: this will not import additional files.

    :param cwl_path: PATH to the CWL file
    :type cwl_path: str
    :return: :class:`cwlgen.Workflow` | :class:`cwlgen.CommandLineTool`
    """

    with open(cwl_path) as yaml_file:
        cwl_dict = ryaml.load(yaml_file, Loader=ryaml.Loader)
    return parse_cwl_dict(cwl_dict)


def parse_cwl_string(cwlstr):
    cwl_dict = ryaml.load(cwlstr, Loader=ryaml.Loader)
    return parse_cwl_dict(cwl_dict)


def parse_cwl_dict(cwl_dict):
    """
    Method that parses a dictionary and will return a
    :class:`cwlgen.Workflow` or :class:`cwlgen.CommandLineTool`.

    :param cwl_dict: The dictionary to pass, must contain a 'class' field.
    :type cwl_dict: :class:`dict`
    :return: :class:`cwlgen.Workflow` | :class:`cwlgen.CommandLineTool`
    """
    cl = cwl_dict.get("class")

    if cl == "CommandLineTool":
        return cwlgen.CommandLineTool.parse_dict(cwl_dict)
    elif cl == "Workflow":
        return cwlgen.Workflow.parse_dict(cwl_dict)

    raise NotImplementedError("The CWL class '" + str(cl) + "' was not a recognised CWL class")