import json
import os
import re
import sys
from env_files.constants import GLOBAL_FILE
from aws.constants import PROD_ENVS, PRODUCTION , STG_PROD_ENVS , STAGING
from actions_logging.app_logging import logger
from github.env import exit_on_error_and_write_summary, get_required_env_var


def replace_env_vars(text):
    pattern = r'\$([A-Za-z_][A-Za-z0-9_]*)'  # Regular expression to match environment variable syntax

    def replace_var(match):
        var_name = match.group(1)
        if var_name in os.environ:
            return os.environ[var_name]
        else:
            logger.info(f"no env var for {var_name}. return only the var name")
            return f'${var_name}'
    replaced_text = re.sub(pattern, replace_var, text)
    return replaced_text


def replace_vars_and_set_env(file_path):
    try:
        with open(file_path, 'r') as file:
            json_data = json.load(file)
    except FileNotFoundError as e:
        logger.info(f"env file did not found in {file_path}, exiting")
        os.system(f'''echo ":stop_sign: ERROR - env file did not found in {file_path}" >> $GITHUB_STEP_SUMMARY''')
        #exit(1)
        logger.info("using template.json insted")
        file_path =f".github/env_files/{prefix_path_extra}{dir_name}/template.json"
        with open(file_path, 'r') as file:
            json_data = json.load(file)
    for key in json_data:
        value = json_data[key]
        if "$" not in value:
            new_value = value
        else:
            new_value = replace_env_vars(value)
        os.environ[key] = new_value
        os.system(f"""echo "{key}={new_value}" >> $GITHUB_ENV""")


env_name = os.getenv('ENV_NAME')

env_level = "dev"
if env_name in PROD_ENVS:
    env_level = PRODUCTION
elif env_name in STG_PROD_ENVS:
    env_level = STAGING

dir_name = env_level


prefix_path_extra = ""
logger.info(sys.argv)
if len(sys.argv) > 1:
    prefix_path_extra = f'{sys.argv[1].replace("svc_dir=", "", 1)}/'
only_global = False
if len(sys.argv) > 2:
    only_global_input = sys.argv[2].replace("only_global=", "", 1)
    if only_global_input == 'true':
        only_global = True
    elif only_global_input == 'false':
        pass
    else:
        logger.info(f"only global I get is {only_global_input}. I don't know what to do with it so I set it to False")

file_paths = [
    f".github/env_files/{prefix_path_extra}{GLOBAL_FILE}",
    f".github/env_files/{prefix_path_extra}{dir_name}/{env_name}.json"
]


for file_path in file_paths:
    if only_global:
        if GLOBAL_FILE not in file_path:
            continue
    replace_vars_and_set_env(file_path)
