import boto3
import os
import time
from github.env  import get_required_env_var
from actions_logging.app_logging import logger
from aws.msk.msk_info import get_msk_environment_name

_SLEEP_TIME = 10
_CREATING = 'CREATING'
_DELETING = 'DELETING'


def list_connectors(prefix) -> dict:
    """
  List Kafka Connect connectors
  """
    kafka_connect_client = boto3.client('kafkaconnect', region_name=_AWS_REGION)
    response = kafka_connect_client.list_connectors(
        connectorNamePrefix=prefix,
        maxResults=100
    )
    connectors_list = response['connectors']
    logger.info('--  connectors list --')
    for i, conn in enumerate(connectors_list, 1):
        logger.info(f'{i}) {conn["connectorArn"]}')
    logger.info('--  connectors list end --')
    return response['connectors']


def _wait_until_connector_is_created(conn_arn: str):
    go = True
    counter = 1
    while go:
        resp = kafka_connect_client.describe_connector(connectorArn=conn_arn)
        counter += 1
        if resp['connectorState'] == 'CREATING':
            logger.info(f'{counter}) connector still creating. {counter * _SLEEP_TIME} seconds passed')
        elif resp['connectorState'] == 'FAILED':
            logger.error(f"connector {conn_plugin_name} failed to create. exit")
            exit(1)
        elif resp['connectorState'] == 'RUNNING':
            logger.info(f"connector {conn_plugin_name} created successfully done")
            go = False
        else:
            logger.error(f"connector {conn_plugin_name} not in wanted state: {resp['connectorState']}. exit")
            exit(1)
        time.sleep(_SLEEP_TIME)


if __name__ == "__main__":
    logger.info("sts caller identity:")
    sts = boto3.client("sts")
    response = sts.get_caller_identity()
    logger.info(response)
    os.system('aws sts get-caller-identity --output text')
    env = get_required_env_var('ENV_NAME')
    msk_env = get_msk_environment_name(env)
    _AWS_REGION = get_required_env_var("AWS_MSK_REGION")
    _CONNECTOR_NAME = get_required_env_var("CONNECTOR_NAME")
    logger.info(f"env {env}")
    logger.info(f"_AWS_REGION {_AWS_REGION}")
    logger.info(f"_CONNECTOR_NAME {_CONNECTOR_NAME}")
    kafka_connect_client = boto3.client('kafkaconnect', region_name=_AWS_REGION)
    logger.info(f'ENV: {env}')
    conn_plugin_name = f'{msk_env}-{_CONNECTOR_NAME}'
    conn_list = list_connectors(conn_plugin_name)
    for con in conn_list:
        _wait_until_connector_is_created(con["connectorArn"])