from __future__ import unicode_literals
import boto3

import sure  # noqa
from moto import mock_autoscaling, mock_ec2, mock_elbv2

from .utils import setup_networking
from tests import EXAMPLE_AMI_ID


@mock_elbv2
@mock_autoscaling
def test_attach_detach_target_groups():
    mocked_networking = setup_networking()
    INSTANCE_COUNT = 2
    client = boto3.client("autoscaling", region_name="us-east-1")
    elbv2_client = boto3.client("elbv2", region_name="us-east-1")

    response = elbv2_client.create_target_group(
        Name="a-target",
        Protocol="HTTP",
        Port=8080,
        VpcId=mocked_networking["vpc"],
        HealthCheckProtocol="HTTP",
        HealthCheckPort="8080",
        HealthCheckPath="/",
        HealthCheckIntervalSeconds=5,
        HealthCheckTimeoutSeconds=5,
        HealthyThresholdCount=5,
        UnhealthyThresholdCount=2,
        Matcher={"HttpCode": "200"},
    )
    target_group_arn = response["TargetGroups"][0]["TargetGroupArn"]

    client.create_launch_configuration(
        LaunchConfigurationName="test_launch_configuration",
        ImageId=EXAMPLE_AMI_ID,
        InstanceType="t2.medium",
    )

    # create asg, attach to target group on create
    client.create_auto_scaling_group(
        AutoScalingGroupName="test_asg",
        LaunchConfigurationName="test_launch_configuration",
        MinSize=0,
        MaxSize=INSTANCE_COUNT,
        DesiredCapacity=INSTANCE_COUNT,
        TargetGroupARNs=[target_group_arn],
        VPCZoneIdentifier=mocked_networking["subnet1"],
    )
    # create asg without attaching to target group
    client.create_auto_scaling_group(
        AutoScalingGroupName="test_asg2",
        LaunchConfigurationName="test_launch_configuration",
        MinSize=0,
        MaxSize=INSTANCE_COUNT,
        DesiredCapacity=INSTANCE_COUNT,
        VPCZoneIdentifier=mocked_networking["subnet2"],
    )

    response = client.describe_load_balancer_target_groups(
        AutoScalingGroupName="test_asg"
    )
    list(response["LoadBalancerTargetGroups"]).should.have.length_of(1)

    response = elbv2_client.describe_target_health(TargetGroupArn=target_group_arn)
    list(response["TargetHealthDescriptions"]).should.have.length_of(INSTANCE_COUNT)

    client.attach_load_balancer_target_groups(
        AutoScalingGroupName="test_asg2", TargetGroupARNs=[target_group_arn]
    )

    response = elbv2_client.describe_target_health(TargetGroupArn=target_group_arn)
    list(response["TargetHealthDescriptions"]).should.have.length_of(INSTANCE_COUNT * 2)

    response = client.detach_load_balancer_target_groups(
        AutoScalingGroupName="test_asg2", TargetGroupARNs=[target_group_arn]
    )
    response = elbv2_client.describe_target_health(TargetGroupArn=target_group_arn)
    list(response["TargetHealthDescriptions"]).should.have.length_of(INSTANCE_COUNT)


@mock_elbv2
@mock_autoscaling
def test_detach_all_target_groups():
    mocked_networking = setup_networking()
    INSTANCE_COUNT = 2
    client = boto3.client("autoscaling", region_name="us-east-1")
    elbv2_client = boto3.client("elbv2", region_name="us-east-1")

    response = elbv2_client.create_target_group(
        Name="a-target",
        Protocol="HTTP",
        Port=8080,
        VpcId=mocked_networking["vpc"],
        HealthCheckProtocol="HTTP",
        HealthCheckPort="8080",
        HealthCheckPath="/",
        HealthCheckIntervalSeconds=5,
        HealthCheckTimeoutSeconds=5,
        HealthyThresholdCount=5,
        UnhealthyThresholdCount=2,
        Matcher={"HttpCode": "200"},
    )
    target_group_arn = response["TargetGroups"][0]["TargetGroupArn"]

    client.create_launch_configuration(
        LaunchConfigurationName="test_launch_configuration",
        ImageId=EXAMPLE_AMI_ID,
        InstanceType="t2.medium",
    )

    client.create_auto_scaling_group(
        AutoScalingGroupName="test_asg",
        LaunchConfigurationName="test_launch_configuration",
        MinSize=0,
        MaxSize=INSTANCE_COUNT,
        DesiredCapacity=INSTANCE_COUNT,
        TargetGroupARNs=[target_group_arn],
        VPCZoneIdentifier=mocked_networking["subnet1"],
    )

    response = client.describe_load_balancer_target_groups(
        AutoScalingGroupName="test_asg"
    )
    list(response["LoadBalancerTargetGroups"]).should.have.length_of(1)

    response = elbv2_client.describe_target_health(TargetGroupArn=target_group_arn)
    list(response["TargetHealthDescriptions"]).should.have.length_of(INSTANCE_COUNT)

    response = client.detach_load_balancer_target_groups(
        AutoScalingGroupName="test_asg", TargetGroupARNs=[target_group_arn]
    )

    response = elbv2_client.describe_target_health(TargetGroupArn=target_group_arn)
    list(response["TargetHealthDescriptions"]).should.have.length_of(0)
    response = client.describe_load_balancer_target_groups(
        AutoScalingGroupName="test_asg"
    )
    list(response["LoadBalancerTargetGroups"]).should.have.length_of(0)
