# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

from oslo_config import cfg
from senlin.drivers import base
from senlin.drivers.openstack import sdk


class MistralClient(base.DriverBase):
    """Mistral V2 driver."""

    def __init__(self, params):
        super(MistralClient, self).__init__(params)
        self.conn = sdk.create_connection(params)
        self.session = self.conn.session

    @sdk.translate_exception
    def workflow_create(self, definition, scope):
        attrs = {
            'definition': definition,
            'scope': scope
        }
        return self.conn.workflow.create_workflow(**attrs)

    @sdk.translate_exception
    def workflow_delete(self, workflow, ignore_missing=True):
        res = self.conn.workflow.delete_workflow(
            workflow, ignore_missing=ignore_missing)
        return res

    @sdk.translate_exception
    def workflow_find(self, name_or_id, ignore_missing=True):
        res = self.conn.workflow.find_workflow(
            name_or_id, ignore_missing=ignore_missing)
        return res

    @sdk.translate_exception
    def execution_create(self, name, inputs):
        attrs = {
            'workflow_name': name,
            'input': inputs
        }
        return self.conn.workflow.create_execution(**attrs)

    @sdk.translate_exception
    def execution_delete(self, execution, ignore_missing=True):
        res = self.conn.workflow.delete_execution(
            execution, ignore_missing=ignore_missing)
        return res

    @sdk.translate_exception
    def wait_for_execution(self, execution, status='SUCCESS',
                           failures=['ERROR'], interval=2,
                           timeout=None):
        '''Wait for execution creation complete'''
        if timeout is None:
            timeout = cfg.CONF.default_action_timeout

        execution_obj = self.conn.workflow.find_execution(execution, False)
        self.conn.workflow.wait_for_status(execution_obj, status, failures,
                                           interval, timeout)
        return
