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

hub.exec.boto3.client.cloudwatch.delete_dashboards
hub.exec.boto3.client.cloudwatch.get_dashboard
hub.exec.boto3.client.cloudwatch.list_dashboards
hub.exec.boto3.client.cloudwatch.put_dashboard
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, dashboard_name: Text, dashboard_body: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a dashboard if it does not already exist, or updates an existing dashboard. If you update a dashboard,
    the entire contents are replaced with what you specify here. All dashboards in your account are global, not
    region-specific. A simple way to create a dashboard using PutDashboard is to copy an existing dashboard. To copy
    an existing dashboard using the console, you can load the dashboard and then use the View/edit source command in
    the Actions menu to display the JSON block for that dashboard. Another way to copy a dashboard is to use
    GetDashboard, and then use the data returned within DashboardBody as the template for the new dashboard when you
    call PutDashboard. When you create a dashboard with PutDashboard, a good practice is to add a text widget at the
    top of the dashboard with a message that the dashboard was created by script and should not be changed in the
    console. This message could also point console users to the location of the DashboardBody script or the
    CloudFormation template used to create the dashboard.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        dashboard_name(Text): The name of the dashboard. If a dashboard with this name already exists, this call modifies that
            dashboard, replacing its current contents. Otherwise, a new dashboard is created. The maximum
            length is 255, and valid characters are A-Z, a-z, 0-9, "-", and "_". This parameter is required.
        dashboard_body(Text): The detailed information about the dashboard in JSON format, including the widgets to include
            and their location on the dashboard. This parameter is required. For more information about the
            syntax, see Dashboard Body Structure and Syntax.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.cloudwatch.dashboard.present:
                - name: value
                - dashboard_name: value
                - dashboard_body: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.cloudwatch.dashboard.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.cloudwatch.get_dashboard(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.cloudwatch.put_dashboard(
                ctx,
                
                
                **{"DashboardName": dashboard_name, "DashboardBody": dashboard_body}
            )
            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.cloudwatch.get_dashboard(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, dashboard_names: List)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes all dashboards that you specify. You can specify up to 100 dashboards to delete. If there is an error
    during this call, no dashboards are deleted.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        dashboard_names(List): The dashboards to be deleted. This parameter is required.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

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

