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

hub.exec.boto3.client.rds.copy_db_parameter_group
hub.exec.boto3.client.rds.create_db_parameter_group
hub.exec.boto3.client.rds.delete_db_parameter_group
hub.exec.boto3.client.rds.describe_db_parameter_groups
hub.exec.boto3.client.rds.modify_db_parameter_group
hub.exec.boto3.client.rds.reset_db_parameter_group
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, db_parameter_group_name: Text, db_parameter_group_family: Text, description: Text, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new DB parameter group.  A DB parameter group is initially created with the default parameters for the
    database engine used by the DB instance. To provide custom values for any of the parameters, you must modify the
    group after creating it using ModifyDBParameterGroup. Once you've created a DB parameter group, you need to
    associate it with your DB instance using ModifyDBInstance. When you associate a new DB parameter group with a
    running DB instance, you need to reboot the DB instance without failover for the new DB parameter group and
    associated settings to take effect.   After you create a DB parameter group, you should wait at least 5 minutes
    before creating your first DB instance that uses that DB parameter group as the default parameter group. This
    allows Amazon RDS to fully complete the create action before the parameter group is used as the default for a
    new DB instance. This is especially important for parameters that are critical when creating the default
    database for a DB instance, such as the character set for the default database defined by the
    character_set_database parameter. You can use the Parameter Groups option of the Amazon RDS console or the
    DescribeDBParameters command to verify that your DB parameter group has been created or modified.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        db_parameter_group_name(Text): The name of the DB parameter group. Constraints:   Must be 1 to 255 letters, numbers, or
            hyphens.   First character must be a letter   Can't end with a hyphen or contain two consecutive
            hyphens    This value is stored as a lowercase string.
        db_parameter_group_family(Text): The DB parameter group family name. A DB parameter group can be associated with one and only one
            DB parameter group family, and can be applied only to a DB instance running a database engine
            and engine version compatible with that DB parameter group family. To list all of the available
            parameter group families for a DB engine, use the following command:  aws rds describe-db-
            engine-versions --query "DBEngineVersions[].DBParameterGroupFamily" --engine <engine>  For
            example, to list all of the available parameter group families for the MySQL DB engine, use the
            following command:  aws rds describe-db-engine-versions --query
            "DBEngineVersions[].DBParameterGroupFamily" --engine mysql   The output contains duplicates.
            The following are the valid DB engine values:    aurora (for MySQL 5.6-compatible Aurora)
            aurora-mysql (for MySQL 5.7-compatible Aurora)    aurora-postgresql     mariadb     mysql
            oracle-ee     oracle-ee-cdb     oracle-se2     oracle-se2-cdb     postgres     sqlserver-ee
            sqlserver-se     sqlserver-ex     sqlserver-web.
        description(Text): The description for the DB parameter group.
        tags(List, optional): Tags to assign to the DB parameter group. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.rds.db_parameter_group.present:
                - name: value
                - db_parameter_group_name: value
                - db_parameter_group_family: value
                - description: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.rds.db_parameter_group.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.rds.describe_db_parameter_groups(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.rds.create_db_parameter_group(
                ctx,
                
                
                **{"DBParameterGroupName": db_parameter_group_name, "DBParameterGroupFamily": db_parameter_group_family, "Description": description, "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.rds.describe_db_parameter_groups(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, db_parameter_group_name: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a specified DB parameter group. The DB parameter group to be deleted can't be associated with any DB
    instances.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        db_parameter_group_name(Text): The name of the DB parameter group. Constraints:   Must be the name of an existing DB parameter
            group   You can't delete a default DB parameter group   Can't be associated with any DB
            instances.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

