from __future__ import unicode_literals

import boto.datapipeline
import sure  # noqa

from moto import mock_datapipeline_deprecated
from moto.datapipeline.utils import remove_capitalization_of_dict_keys


def get_value_from_fields(key, fields):
    for field in fields:
        if field['key'] == key:
            return field['stringValue']


@mock_datapipeline_deprecated
def test_create_pipeline():
    conn = boto.datapipeline.connect_to_region("us-west-2")

    res = conn.create_pipeline("mypipeline", "some-unique-id")

    pipeline_id = res["pipelineId"]
    pipeline_descriptions = conn.describe_pipelines(
        [pipeline_id])["pipelineDescriptionList"]
    pipeline_descriptions.should.have.length_of(1)

    pipeline_description = pipeline_descriptions[0]
    pipeline_description['name'].should.equal("mypipeline")
    pipeline_description["pipelineId"].should.equal(pipeline_id)
    fields = pipeline_description['fields']

    get_value_from_fields('@pipelineState', fields).should.equal("PENDING")
    get_value_from_fields('uniqueId', fields).should.equal("some-unique-id")


PIPELINE_OBJECTS = [
    {
        "id": "Default",
        "name": "Default",
        "fields": [{
            "key": "workerGroup",
            "stringValue": "workerGroup"
        }]
    },
    {
        "id": "Schedule",
        "name": "Schedule",
        "fields": [{
            "key": "startDateTime",
            "stringValue": "2012-12-12T00:00:00"
        }, {
            "key": "type",
            "stringValue": "Schedule"
        }, {
            "key": "period",
            "stringValue": "1 hour"
        }, {
            "key": "endDateTime",
            "stringValue": "2012-12-21T18:00:00"
        }]
    },
    {
        "id": "SayHello",
        "name": "SayHello",
        "fields": [{
            "key": "type",
            "stringValue": "ShellCommandActivity"
        }, {
            "key": "command",
            "stringValue": "echo hello"
        }, {
            "key": "parent",
            "refValue": "Default"
        }, {
            "key": "schedule",
            "refValue": "Schedule"
        }]
    }
]


@mock_datapipeline_deprecated
def test_creating_pipeline_definition():
    conn = boto.datapipeline.connect_to_region("us-west-2")
    res = conn.create_pipeline("mypipeline", "some-unique-id")
    pipeline_id = res["pipelineId"]

    conn.put_pipeline_definition(PIPELINE_OBJECTS, pipeline_id)

    pipeline_definition = conn.get_pipeline_definition(pipeline_id)
    pipeline_definition['pipelineObjects'].should.have.length_of(3)
    default_object = pipeline_definition['pipelineObjects'][0]
    default_object['name'].should.equal("Default")
    default_object['id'].should.equal("Default")
    default_object['fields'].should.equal([{
        "key": "workerGroup",
        "stringValue": "workerGroup"
    }])


@mock_datapipeline_deprecated
def test_describing_pipeline_objects():
    conn = boto.datapipeline.connect_to_region("us-west-2")
    res = conn.create_pipeline("mypipeline", "some-unique-id")
    pipeline_id = res["pipelineId"]

    conn.put_pipeline_definition(PIPELINE_OBJECTS, pipeline_id)

    objects = conn.describe_objects(["Schedule", "Default"], pipeline_id)[
        'pipelineObjects']

    objects.should.have.length_of(2)
    default_object = [x for x in objects if x['id'] == 'Default'][0]
    default_object['name'].should.equal("Default")
    default_object['fields'].should.equal([{
        "key": "workerGroup",
        "stringValue": "workerGroup"
    }])


@mock_datapipeline_deprecated
def test_activate_pipeline():
    conn = boto.datapipeline.connect_to_region("us-west-2")

    res = conn.create_pipeline("mypipeline", "some-unique-id")

    pipeline_id = res["pipelineId"]
    conn.activate_pipeline(pipeline_id)

    pipeline_descriptions = conn.describe_pipelines(
        [pipeline_id])["pipelineDescriptionList"]
    pipeline_descriptions.should.have.length_of(1)
    pipeline_description = pipeline_descriptions[0]
    fields = pipeline_description['fields']

    get_value_from_fields('@pipelineState', fields).should.equal("SCHEDULED")


@mock_datapipeline_deprecated
def test_delete_pipeline():
    conn = boto.datapipeline.connect_to_region("us-west-2")
    res = conn.create_pipeline("mypipeline", "some-unique-id")
    pipeline_id = res["pipelineId"]

    conn.delete_pipeline(pipeline_id)

    response = conn.list_pipelines()

    response["pipelineIdList"].should.have.length_of(0)


@mock_datapipeline_deprecated
def test_listing_pipelines():
    conn = boto.datapipeline.connect_to_region("us-west-2")
    res1 = conn.create_pipeline("mypipeline1", "some-unique-id1")
    res2 = conn.create_pipeline("mypipeline2", "some-unique-id2")

    response = conn.list_pipelines()

    response["hasMoreResults"].should.be(False)
    response["marker"].should.be.none
    response["pipelineIdList"].should.have.length_of(2)
    response["pipelineIdList"].should.contain({
        "id": res1["pipelineId"],
        "name": "mypipeline1",
    })
    response["pipelineIdList"].should.contain({
        "id": res2["pipelineId"],
        "name": "mypipeline2"
    })


@mock_datapipeline_deprecated
def test_listing_paginated_pipelines():
    conn = boto.datapipeline.connect_to_region("us-west-2")
    for i in range(100):
        conn.create_pipeline("mypipeline%d" % i, "some-unique-id%d" % i)

    response = conn.list_pipelines()

    response["hasMoreResults"].should.be(True)
    response["marker"].should.equal(response["pipelineIdList"][-1]['id'])
    response["pipelineIdList"].should.have.length_of(50)


# testing a helper function
def test_remove_capitalization_of_dict_keys():
    result = remove_capitalization_of_dict_keys(
        {
            "Id": "IdValue",
            "Fields": [{
                "Key": "KeyValue",
                "StringValue": "StringValueValue"
            }]
        }
    )

    result.should.equal({
        "id": "IdValue",
        "fields": [{
            "key": "KeyValue",
            "stringValue": "StringValueValue"
        }],
    })