import os
import logging

logging.basicConfig(level=logging.INFO, format="%(levelname)s %(asctime)s - %(message)s")


lambda_changed = False
changed_lambda_dirs = set()
lambda_name = os.getenv('LAMBDA_NAME', None)  # mono service
lambda_root_path = os.getenv('LAMBDA_ROOT_PATH', '')  # path for lambda|s code
is_multi_service_repo = os.getenv('IS_MULTI_SERVICE_REPO')

changed_dirs = os.getenv('CHANGED_DIRS')
logging.info("env vars:")
logging.info(f"LAMBDA_NAME: {lambda_name}")
logging.info(f"LAMBDA_ROOT_PATH: {lambda_root_path}")
logging.info(f"CHANGED_DIRS: {changed_dirs}")
logging.info(f"IS_MULTI_SERVICE_REPO: {is_multi_service_repo}")

if changed_dirs:
    changed_dir_list = [x.replace("[", "").replace("]", "").strip() for x in changed_dirs.split(',')]
    logging.info(f"new changed dir list: {changed_dir_list}")
    for dir_name in changed_dir_list:
        if dir_name.startswith(".github/env_files"):
            logging.info(f"env files changed: {dir_name}")
            os.system(f'''echo "ENV_VARS_CHANGED=true" >> $GITHUB_ENV''')
        elif dir_name.startswith("infra/"):
            logging.info(f"infra changed: {dir_name}")
            os.system(f'''echo "INFRA_CHANGED=true" >> $GITHUB_ENV''')
        else:
            if lambda_name or is_multi_service_repo == 'false':  # mono lambda repo
                if dir_name.startswith(lambda_root_path):
                    logging.info(f"dir name: {dir_name} start with root path-"
                                 f" {lambda_root_path}, set lambda changed to True")
                    lambda_changed = True
            elif is_multi_service_repo == 'true':  # multi lambda repo
                if "common" in dir_name:
                    logging.info(f"common in the dir name {dir_name}, skipping")
                    continue
                if dir_name == ".":
                    logging.info("multi lambda repo (no lambda name) changed dir is '.' skipping")
                    continue
                if dir_name.startswith(lambda_root_path):
                    # assume that the main dir name of every lambda is the lambda name. extract the lambda names:
                    logging.info(f"dir name: {dir_name} start with root path-"
                                 f" {lambda_root_path}, set lambda changed to True")
                    lambda_changed = True
                    changed_lambda_path = dir_name.replace(lambda_root_path, "")
                    if changed_lambda_path.startswith("/"):
                        changed_lambda_path = changed_lambda_path[1:]
                    split_path = changed_lambda_path.split("/")
                    changed_lambda_dir = split_path[0]
                    logging.info(f"adding changed lambda dir {changed_lambda_dir} to lambdas set")
                    changed_lambda_dirs.add(changed_lambda_dir)

else:
    logging.info("no files has been changed")
    exit(0)

if lambda_changed:
    logging.info(f"the lambdas that has been changed: {changed_lambda_dirs}, set LAMBDA_CHANGED to true")
    os.system(f'''echo "LAMBDA_CHANGED=true" >> $GITHUB_ENV''')
    if len(changed_lambda_dirs) > 1:
        error_message = f"more then 1 lambda has been changed. NOT ALLOWED: {changed_lambda_dirs}"
        logging.error(error_message)
        os.system(f'''echo ":stop_sign: ERROR - {error_message}" >> $GITHUB_STEP_SUMMARY''')
        logging.info(f"more then one lambda has been changed. setting TO_BUILD_LAMBDA to false")
        os.system(f'''echo "TO_BUILD_LAMBDA=false" >> $GITHUB_ENV''')
    elif len(changed_lambda_dirs) == 1 or lambda_name:
        logging.info("exactly one lambda has changed, setting TO_BUILD_LAMBDA to true")
        os.system(f'''echo "TO_BUILD_LAMBDA=true" >> $GITHUB_ENV''')
        try:
            logging.info(f"try to get lambda name from the dir that changed")
            lambda_dir_name = list(changed_lambda_dirs)[0]
        except Exception as e:
            logging.info(f"exception in modifying set of changed dirs of lambdas to list: {e}")
            lambda_dir_name = ""
        os.system(f'''echo "CHANGED_LAMBDA_DIR={lambda_dir_name}" >> $GITHUB_ENV''')
        if not lambda_name:
            logging.info(f"when no lambda name in multi lambda repo and one lambda"
                         f" changed setting LAMBDA_NAME to dir name {lambda_dir_name}")
            os.system(f'''echo "LAMBDA_NAME={lambda_dir_name}" >> $GITHUB_ENV''')
            if lambda_root_path:
                lambda_path_prefix = f"{lambda_root_path}/"
            else:
                lambda_path_prefix = ""
            logging.info(f"when no lambda name in multi lambda repo and one lambda"
                         f" changed setting LAMBDA_PATH to {lambda_path_prefix}{lambda_dir_name}")
            os.system(f'''echo "LAMBDA_PATH={lambda_path_prefix}{lambda_dir_name}" >> $GITHUB_ENV''')
