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

hub.exec.boto3.client.lightsail.create_relational_database
hub.exec.boto3.client.lightsail.delete_relational_database
hub.exec.boto3.client.lightsail.get_relational_databases
hub.exec.boto3.client.lightsail.reboot_relational_database
hub.exec.boto3.client.lightsail.start_relational_database
hub.exec.boto3.client.lightsail.stop_relational_database
hub.exec.boto3.client.lightsail.update_relational_database
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, relational_database_name: Text, relational_database_blueprint_id: Text, relational_database_bundle_id: Text, master_database_name: Text, master_username: Text, availability_zone: Text = None, master_user_password: Text = None, preferred_backup_window: Text = None, preferred_maintenance_window: Text = None, publicly_accessible: bool = None, tags: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a new database in Amazon Lightsail. The create relational database operation supports tag-based access
    control via request tags. For more information, see the Amazon Lightsail Developer Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        relational_database_name(Text): The name to use for your new Lightsail database resource. Constraints:   Must contain from 2 to
            255 alphanumeric characters, or hyphens.   The first and last character must be a letter or
            number.
        availability_zone(Text, optional): The Availability Zone in which to create your new database. Use the us-east-2a case-sensitive
            format. You can get a list of Availability Zones by using the get regions operation. Be sure to
            add the include relational database Availability Zones parameter to your request. Defaults to None.
        relational_database_blueprint_id(Text): The blueprint ID for your new database. A blueprint describes the major engine version of a
            database. You can get a list of database blueprints IDs by using the get relational database
            blueprints operation.
        relational_database_bundle_id(Text): The bundle ID for your new database. A bundle describes the performance specifications for your
            database. You can get a list of database bundle IDs by using the get relational database bundles
            operation.
        master_database_name(Text): The meaning of this parameter differs according to the database engine you use.  MySQL  The name
            of the database to create when the Lightsail database resource is created. If this parameter
            isn't specified, no database is created in the database resource. Constraints:   Must contain 1
            to 64 letters or numbers.   Must begin with a letter. Subsequent characters can be letters,
            underscores, or digits (0- 9).   Can't be a word reserved by the specified database engine. For
            more information about reserved words in MySQL, see the Keywords and Reserved Words articles for
            MySQL 5.6, MySQL 5.7, and MySQL 8.0.    PostgreSQL  The name of the database to create when the
            Lightsail database resource is created. If this parameter isn't specified, a database named
            postgres is created in the database resource. Constraints:   Must contain 1 to 63 letters or
            numbers.   Must begin with a letter. Subsequent characters can be letters, underscores, or
            digits (0- 9).   Can't be a word reserved by the specified database engine. For more information
            about reserved words in PostgreSQL, see the SQL Key Words articles for PostgreSQL 9.6,
            PostgreSQL 10, PostgreSQL 11, and PostgreSQL 12.
        master_username(Text): The name for the master user.  MySQL  Constraints:   Required for MySQL.   Must be 1 to 16
            letters or numbers. Can contain underscores.   First character must be a letter.   Can't be a
            reserved word for the chosen database engine. For more information about reserved words in MySQL
            5.6 or 5.7, see the Keywords and Reserved Words articles for MySQL 5.6, MySQL 5.7, or MySQL 8.0.
            PostgreSQL  Constraints:   Required for PostgreSQL.   Must be 1 to 63 letters or numbers. Can
            contain underscores.   First character must be a letter.   Can't be a reserved word for the
            chosen database engine. For more information about reserved words in MySQL 5.6 or 5.7, see the
            Keywords and Reserved Words articles for PostgreSQL 9.6, PostgreSQL 10, PostgreSQL 11, and
            PostgreSQL 12.
        master_user_password(Text, optional): The password for the master user. The password can include any printable ASCII character except
            "/", """, or "@". It cannot contain spaces.  MySQL  Constraints: Must contain from 8 to 41
            characters.  PostgreSQL  Constraints: Must contain from 8 to 128 characters. Defaults to None.
        preferred_backup_window(Text, optional): The daily time range during which automated backups are created for your new database if
            automated backups are enabled. The default is a 30-minute window selected at random from an
            8-hour block of time for each AWS Region. For more information about the preferred backup window
            time blocks for each region, see the Working With Backups guide in the Amazon Relational
            Database Service (Amazon RDS) documentation. Constraints:   Must be in the hh24:mi-hh24:mi
            format. Example: 16:00-16:30    Specified in Coordinated Universal Time (UTC).   Must not
            conflict with the preferred maintenance window.   Must be at least 30 minutes. Defaults to None.
        preferred_maintenance_window(Text, optional): The weekly time range during which system maintenance can occur on your new database. The
            default is a 30-minute window selected at random from an 8-hour block of time for each AWS
            Region, occurring on a random day of the week. Constraints:   Must be in the ddd:hh24:mi-
            ddd:hh24:mi format.   Valid days: Mon, Tue, Wed, Thu, Fri, Sat, Sun.   Must be at least 30
            minutes.   Specified in Coordinated Universal Time (UTC).   Example: Tue:17:00-Tue:17:30. Defaults to None.
        publicly_accessible(bool, optional): Specifies the accessibility options for your new database. A value of true specifies a database
            that is available to resources outside of your Lightsail account. A value of false specifies a
            database that is available only to your Lightsail resources in the same region as your database. Defaults to None.
        tags(List, optional): The tag keys and optional values to add to the resource during create. Use the TagResource
            action to tag a resource after it's created. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.lightsail.relational_database.present:
                - name: value
                - relational_database_name: value
                - relational_database_blueprint_id: value
                - relational_database_bundle_id: value
                - master_database_name: value
                - master_username: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.lightsail.relational_database.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.lightsail.get_relational_databases(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.lightsail.create_relational_database(
                ctx,
                
                
                **{"relationalDatabaseName": relational_database_name, "availabilityZone": availability_zone, "relationalDatabaseBlueprintId": relational_database_blueprint_id, "relationalDatabaseBundleId": relational_database_bundle_id, "masterDatabaseName": master_database_name, "masterUsername": master_username, "masterUserPassword": master_user_password, "preferredBackupWindow": preferred_backup_window, "preferredMaintenanceWindow": preferred_maintenance_window, "publiclyAccessible": publicly_accessible, "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.lightsail.get_relational_databases(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, relational_database_name: Text, skip_final_snapshot: bool = None, final_relational_database_snapshot_name: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a database in Amazon Lightsail. The delete relational database operation supports tag-based access
    control via resource tags applied to the resource identified by relationalDatabaseName. For more information,
    see the Amazon Lightsail Developer Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        relational_database_name(Text): The name of the database that you are deleting.
        skip_final_snapshot(bool, optional): Determines whether a final database snapshot is created before your database is deleted. If true
            is specified, no database snapshot is created. If false is specified, a database snapshot is
            created before your database is deleted. You must specify the final relational database snapshot
            name parameter if the skip final snapshot parameter is false. Default: false. Defaults to None.
        final_relational_database_snapshot_name(Text, optional): The name of the database snapshot created if skip final snapshot is false, which is the default
            value for that parameter.  Specifying this parameter and also specifying the skip final snapshot
            parameter to true results in an error.  Constraints:   Must contain from 2 to 255 alphanumeric
            characters, or hyphens.   The first and last character must be a letter or number. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.lightsail.delete_relational_database(
                ctx,
                
                
                **{"relationalDatabaseName": relational_database_name, "skipFinalSnapshot": skip_final_snapshot, "finalRelationalDatabaseSnapshotName": final_relational_database_snapshot_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.lightsail.get_relational_databases(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

