"""
Autogenerated state module using `pop-create-idem <https://gitlab.com/saltstack/pop/pop-create-idem>`__

hub.exec.boto3.client.ec2.cancel_capacity_reservation
hub.exec.boto3.client.ec2.create_capacity_reservation
hub.exec.boto3.client.ec2.describe_capacity_reservations
hub.exec.boto3.client.ec2.modify_capacity_reservation
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, instance_type: Text, instance_platform: Text, instance_count: int, availability_zone: Text = None, availability_zone_id: Text = None, tenancy: Text = None, ebs_optimized: bool = None, ephemeral_storage: bool = None, end_date: Text = None, end_date_type: Text = None, instance_match_criteria: Text = None, tag_specifications: List = None, outpost_arn: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new Capacity Reservation with the specified attributes. Capacity Reservations enable you to reserve
    capacity for your Amazon EC2 instances in a specific Availability Zone for any duration. This gives you the
    flexibility to selectively add capacity reservations and still get the Regional RI discounts for that usage. By
    creating Capacity Reservations, you ensure that you always have access to Amazon EC2 capacity when you need it,
    for as long as you need it. For more information, see Capacity Reservations in the Amazon EC2 User Guide. Your
    request to create a Capacity Reservation could fail if Amazon EC2 does not have sufficient capacity to fulfill
    the request. If your request fails due to Amazon EC2 capacity constraints, either try again at a later time, try
    in a different Availability Zone, or request a smaller capacity reservation. If your application is flexible
    across instance types and sizes, try to create a Capacity Reservation with different instance attributes. Your
    request could also fail if the requested quantity exceeds your On-Demand Instance limit for the selected
    instance type. If your request fails due to limit constraints, increase your On-Demand Instance limit for the
    required instance type and try again. For more information about increasing your instance limits, see Amazon EC2
    Service Quotas in the Amazon EC2 User Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        instance_type(Text): The instance type for which to reserve capacity. For more information, see Instance types in the
            Amazon EC2 User Guide.
        instance_platform(Text): The type of operating system for which to reserve capacity.
        availability_zone(Text, optional): The Availability Zone in which to create the Capacity Reservation. Defaults to None.
        availability_zone_id(Text, optional): The ID of the Availability Zone in which to create the Capacity Reservation. Defaults to None.
        tenancy(Text, optional): Indicates the tenancy of the Capacity Reservation. A Capacity Reservation can have one of the
            following tenancy settings:    default - The Capacity Reservation is created on hardware that is
            shared with other Amazon Web Services accounts.    dedicated - The Capacity Reservation is
            created on single-tenant hardware that is dedicated to a single Amazon Web Services account. Defaults to None.
        instance_count(int): The number of instances for which to reserve capacity.
        ebs_optimized(bool, optional): Indicates whether the Capacity Reservation supports EBS-optimized instances. This optimization
            provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide
            optimal I/O performance. This optimization isn't available with all instance types. Additional
            usage charges apply when using an EBS- optimized instance. Defaults to None.
        ephemeral_storage(bool, optional): Indicates whether the Capacity Reservation supports instances with temporary, block-level
            storage. Defaults to None.
        end_date(Text, optional): The date and time at which the Capacity Reservation expires. When a Capacity Reservation
            expires, the reserved capacity is released and you can no longer launch instances into it. The
            Capacity Reservation's state changes to expired when it reaches its end date and time. You must
            provide an EndDate value if EndDateType is limited. Omit EndDate if EndDateType is unlimited. If
            the EndDateType is limited, the Capacity Reservation is cancelled within an hour from the
            specified time. For example, if you specify 5/31/2019, 13:30:55, the Capacity Reservation is
            guaranteed to end between 13:30:55 and 14:30:55 on 5/31/2019. Defaults to None.
        end_date_type(Text, optional): Indicates the way in which the Capacity Reservation ends. A Capacity Reservation can have one of
            the following end types:    unlimited - The Capacity Reservation remains active until you
            explicitly cancel it. Do not provide an EndDate if the EndDateType is unlimited.    limited -
            The Capacity Reservation expires automatically at a specified date and time. You must provide an
            EndDate value if the EndDateType value is limited. Defaults to None.
        instance_match_criteria(Text, optional): Indicates the type of instance launches that the Capacity Reservation accepts. The options
            include:    open - The Capacity Reservation automatically matches all instances that have
            matching attributes (instance type, platform, and Availability Zone). Instances that have
            matching attributes run in the Capacity Reservation automatically without specifying any
            additional parameters.    targeted - The Capacity Reservation only accepts instances that have
            matching attributes (instance type, platform, and Availability Zone), and explicitly target the
            Capacity Reservation. This ensures that only permitted instances can use the reserved capacity.
            Default: open. Defaults to None.
        tag_specifications(List, optional): The tags to apply to the Capacity Reservation during launch. Defaults to None.
        outpost_arn(Text, optional): The Amazon Resource Name (ARN) of the Outpost on which to create the Capacity Reservation. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.ec2.capacity_reservation.present:
                - name: value
                - instance_type: value
                - instance_platform: value
                - instance_count: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.ec2.capacity_reservation.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    
    before = await hub.exec.boto3.client.ec2.describe_capacity_reservations(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.ec2.create_capacity_reservation(
                ctx,
                DryRun=ctx.test,
                ClientToken=name,
                **{"InstanceType": instance_type, "InstancePlatform": instance_platform, "AvailabilityZone": availability_zone, "AvailabilityZoneId": availability_zone_id, "Tenancy": tenancy, "InstanceCount": instance_count, "EbsOptimized": ebs_optimized, "EphemeralStorage": ephemeral_storage, "EndDate": end_date, "EndDateType": end_date_type, "InstanceMatchCriteria": instance_match_criteria, "TagSpecifications": tag_specifications, "OutpostArn": outpost_arn}
            )
            result["result"] = ret["status"]
            if not result["result"]:
                result["comment"] = ret["comment"]
                return result
            ret["comment"] = f"Created '{name}'"
        except hub.tool.boto3.exception.ClientError as e:
            result["comment"] = f"{e.__class__.__name__}: {e}"

    
    # TODO perform other modifications as needed here
    ...

    after = await hub.exec.boto3.client.ec2.describe_capacity_reservations(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, capacity_reservation_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Cancels the specified Capacity Reservation, releases the reserved capacity, and changes the Capacity
    Reservation's state to cancelled. Instances running in the reserved capacity continue running until you stop
    them. Stopped instances that target the Capacity Reservation can no longer launch. Modify these instances to
    either target a different Capacity Reservation, launch On-Demand Instance capacity, or run in any open Capacity
    Reservation that has matching attributes and sufficient capacity.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        capacity_reservation_id(Text): The ID of the Capacity Reservation to be cancelled.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.ec2.capacity_reservation.absent:
                - name: value
                - capacity_reservation_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.ec2.capacity_reservation.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    

    before = await hub.exec.boto3.client.ec2.describe_capacity_reservations(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.ec2.cancel_capacity_reservation(
                ctx,
                DryRun=ctx.test,
                
                **{"CapacityReservationId": capacity_reservation_id}
            )
            result["result"] = ret["status"]
            if not result["result"]:
                result["comment"] = ret["comment"]
                return result
            result["comment"] = f"Deleted '{name}'"
        except hub.tool.boto3.exception.ClientError as e:
            result["comment"] = f"{e.__class__.__name__}: {e}"

    

    after = await hub.exec.boto3.client.ec2.describe_capacity_reservations(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

