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

hub.exec.boto3.client.gamelift.create_build
hub.exec.boto3.client.gamelift.delete_build
hub.exec.boto3.client.gamelift.describe_build
hub.exec.boto3.client.gamelift.list_builds
hub.exec.boto3.client.gamelift.update_build
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text = None, version: Text = None, storage_location: Dict = None, operating_system: Text = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new Amazon GameLift build resource for your game server binary files. Game server binaries must be
    combined into a zip file for use with Amazon GameLift.   When setting up a new game build for GameLift, we
    recommend using the AWS CLI command  upload-build . This helper command combines two tasks: (1) it uploads your
    build files from a file directory to a GameLift Amazon S3 location, and (2) it creates a new build resource.
    The CreateBuild operation can used in the following scenarios:   To create a new game build with build files
    that are in an Amazon S3 location under an AWS account that you control. To use this option, you must first give
    Amazon GameLift access to the Amazon S3 bucket. With permissions in place, call CreateBuild and specify a build
    name, operating system, and the Amazon S3 storage location of your game build.   To directly upload your build
    files to a GameLift Amazon S3 location. To use this option, first call CreateBuild and specify a build name and
    operating system. This operation creates a new build resource and also returns an Amazon S3 location with
    temporary access credentials. Use the credentials to manually upload your build files to the specified Amazon S3
    location. For more information, see Uploading Objects in the Amazon S3 Developer Guide. Build files can be
    uploaded to the GameLift Amazon S3 location once only; that can't be updated.    If successful, this operation
    creates a new build resource with a unique build ID and places it in INITIALIZED status. A build must be in
    READY status before you can create fleets with it.  Learn more   Uploading Your Game    Create a Build with
    Files in Amazon S3   Related actions   CreateBuild | ListBuilds | DescribeBuild | UpdateBuild | DeleteBuild |
    All APIs by task

    Args:
        name(Text, optional): A descriptive label that is associated with a build. Build names do not need to be unique. You
            can use UpdateBuild to change this value later. Defaults to None.
        version(Text, optional): Version information that is associated with a build or script. Version strings do not need to be
            unique. You can use UpdateBuild to change this value later. Defaults to None.
        storage_location(Dict, optional): Information indicating where your game build files are stored. Use this parameter only when
            creating a build with files stored in an Amazon S3 bucket that you own. The storage location
            must specify an Amazon S3 bucket name and key. The location must also specify a role ARN that
            you set up to allow Amazon GameLift to access your Amazon S3 bucket. The S3 bucket and your new
            build must be in the same Region. Defaults to None.
        operating_system(Text, optional): The operating system that the game server binaries are built to run on. This value determines
            the type of fleet resources that you can use for this build. If your game build contains
            multiple executables, they all must run on the same operating system. If an operating system is
            not specified when creating a build, Amazon GameLift uses the default value (WINDOWS_2012). This
            value cannot be changed later. Defaults to None.
        tags(List, optional): A list of labels to assign to the new build resource. Tags are developer-defined key-value
            pairs. Tagging AWS resources are useful for resource management, access management and cost
            allocation. For more information, see  Tagging AWS Resources in the AWS General Reference. Once
            the resource is created, you can use TagResource, UntagResource, and ListTagsForResource to add,
            remove, and view tags. The maximum tag limit may be lower than stated. See the AWS General
            Reference for actual tagging limits. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.gamelift.build.present:
                - 
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.gamelift.build.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.gamelift.describe_build(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.gamelift.create_build(
                ctx,
                
                
                **{"Name": name, "Version": version, "StorageLocation": storage_location, "OperatingSystem": operating_system, "Tags": tags}
            )
            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.gamelift.describe_build(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, build_id: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a build. This operation permanently deletes the build resource and any uploaded build files. Deleting a
    build does not affect the status of any active fleets using the build, but you can no longer create new fleets
    with the deleted build. To delete a build, specify the build ID.   Learn more    Upload a Custom Server Build
    Related actions   CreateBuild | ListBuilds | DescribeBuild | UpdateBuild | DeleteBuild | All APIs by task

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        build_id(Text): A unique identifier for the build to delete. You can use either the build ID or ARN value.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.gamelift.build.absent:
                - name: value
                - build_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.gamelift.build.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.gamelift.describe_build(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.gamelift.delete_build(
                ctx,
                
                
                **{"BuildId": build_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.gamelift.describe_build(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

