from moto.ec2.utils import add_tag_specification

from ._base_response import EC2BaseResponse


class NatGateways(EC2BaseResponse):
    def create_nat_gateway(self) -> str:
        subnet_id = self._get_param("SubnetId")
        allocation_id = self._get_param("AllocationId")
        connectivity_type = self._get_param("ConnectivityType")
        tags = add_tag_specification(self._get_param("TagSpecifications", []))

        nat_gateway = self.ec2_backend.create_nat_gateway(
            subnet_id=subnet_id,
            allocation_id=allocation_id,
            tags=tags,
            connectivity_type=connectivity_type,
        )
        template = self.response_template(CREATE_NAT_GATEWAY)
        return template.render(nat_gateway=nat_gateway)

    def delete_nat_gateway(self) -> str:
        nat_gateway_id = self._get_param("NatGatewayId")
        nat_gateway = self.ec2_backend.delete_nat_gateway(nat_gateway_id)
        template = self.response_template(DELETE_NAT_GATEWAY_RESPONSE)
        return template.render(nat_gateway=nat_gateway)

    def describe_nat_gateways(self) -> str:
        filters = self._filters_from_querystring()
        nat_gateway_ids = self._get_param("NatGatewayIds", [])
        nat_gateways = self.ec2_backend.describe_nat_gateways(filters, nat_gateway_ids)
        template = self.response_template(DESCRIBE_NAT_GATEWAYS_RESPONSE)
        return template.render(nat_gateways=nat_gateways)


DESCRIBE_NAT_GATEWAYS_RESPONSE = """<DescribeNatGatewaysResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
    <requestId>bfed02c6-dae9-47c0-86a2-example</requestId>
    <natGatewaySet>
    {% for nat_gateway in nat_gateways %}
         <item>
            <subnetId>{{ nat_gateway.subnet_id }}</subnetId>
            <natGatewayAddressSet>
            {% for address_set in nat_gateway.address_set %}
                <item>
                    {% if address_set.allocationId %}
                    <allocationId>{{ address_set.allocationId }}</allocationId>
                    {% endif %}
                    {% if address_set.privateIp %}
                    <privateIp>{{ address_set.privateIp }}</privateIp>
                    {% endif %}
                    {% if address_set.publicIp %}
                    <publicIp>{{ address_set.publicIp }}</publicIp>
                    {% endif %}
                    {% if address_set.networkInterfaceId %}
                    <networkInterfaceId>{{ address_set.networkInterfaceId }}</networkInterfaceId>
                    {% endif %}
                    {% if address_set.associationId %}
                    <associationId>{{ address_set.associationId }}</associationId>
                    {% endif %}
                </item>
            {% endfor %}
            </natGatewayAddressSet>
            <createTime>{{ nat_gateway.create_time }}</createTime>
            <vpcId>{{ nat_gateway.vpc_id }}</vpcId>
            <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
            <connectivityType>{{ nat_gateway.connectivity_type }}</connectivityType>
            <state>{{ nat_gateway.state }}</state>
            <tagSet>
                {% for tag in nat_gateway.get_tags() %}
                <item>
                    <key>{{ tag.key }}</key>
                    <value>{{ tag.value }}</value>
                </item>
                {% endfor %}
            </tagSet>
        </item>
    {% endfor %}
    </natGatewaySet>
</DescribeNatGatewaysResponse>
"""

CREATE_NAT_GATEWAY = """<CreateNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
    <requestId>1b74dc5c-bcda-403f-867d-example</requestId>
    <natGateway>
        <subnetId>{{ nat_gateway.subnet_id }}</subnetId>
        <natGatewayAddressSet>
            {% for address_set in nat_gateway.address_set %}
                <item>
                    {% if address_set.allocationId %}
                    <allocationId>{{ address_set.allocationId }}</allocationId>
                    {% endif %}
                    {% if address_set.privateIp %}
                    <privateIp>{{ address_set.privateIp }}</privateIp>
                    {% endif %}
                    {% if address_set.publicIp %}
                    <publicIp>{{ address_set.publicIp }}</publicIp>
                    {% endif %}
                    {% if address_set.networkInterfaceId %}
                    <networkInterfaceId>{{ address_set.networkInterfaceId }}</networkInterfaceId>
                    {% endif %}
                    {% if address_set.associationId %}
                    <associationId>{{ address_set.associationId }}</associationId>
                    {% endif %}
                </item>
            {% endfor %}
        </natGatewayAddressSet>
        <createTime>{{ nat_gateway.create_time }}</createTime>
        <vpcId>{{ nat_gateway.vpc_id }}</vpcId>
        <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
        <connectivityType>{{ nat_gateway.connectivity_type }}</connectivityType>
        <state>{{ nat_gateway.state }}</state>
        <tagSet>
        {% for tag in nat_gateway.get_tags() %}
            <item>
                <key>{{ tag.key }}</key>
                <value>{{ tag.value }}</value>
            </item>
        {% endfor %}
        </tagSet>
    </natGateway>
</CreateNatGatewayResponse>
"""


DELETE_NAT_GATEWAY_RESPONSE = """<DeleteNatGatewayResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/">
    <requestId>741fc8ab-6ebe-452b-b92b-example</requestId>
    <natGatewayId>{{ nat_gateway.id }}</natGatewayId>
</DeleteNatGatewayResponse>"""
