import os
from actions_logging.app_logging import logger
from github.env import write_github_env, exit_on_error_and_write_summary, get_required_env_var
from git.utils import get_dev_version
from common.common import run_command, wait_for_file
from java.maven.mvn_info import get_maven_artifact_dir_and_file
from java.maven.create_settings_xml import create_maven_settings

def build_maven_artifact():
    """Build a Maven artifact with optional Sonar scan,
    handle environment configuration and artifacts."""
    run_sonar_scan = os.getenv("RUN_SONAR_SCAN", "true").lower() == "true"
    sonar_args = os.getenv("SONAR_ARGS", "") if run_sonar_scan else ""
    mvn_profile = os.getenv("MVN_PROFILE", "")
    maven_extra_args = os.getenv("MAVEN_EXTRA_ARGS", "")
    env_name = get_required_env_var("ENV_NAME")
    svc_type = get_required_env_var("SVC_TYPE")
    logger.debug(f"SVC_TYPE is {svc_type}")
    artifact_packaging = "zip"
    dir_to_build = os.path.join(os.getcwd(), connector_name := os.getenv("DIR_TO_BUILD", ""))
    logger.debug(f"Directory to build is {dir_to_build}")
    maven_local_repository = os.path.join(dir_to_build, ".m2")
    logger.debug(f"Maven local repository is {maven_local_repository}")
    is_multi_service = os.getenv("IS_MULTI_SERVICE_REPO") == "true"
    build_from_scratch = os.getenv("BUILD_FROM_SCRATCH", "false").lower() == "true"
    mvn_lifecycle = "install"
    if os.getenv("PUBLISH_ARTIFACT", "false").lower() == "true":
        mvn_lifecycle = "deploy"
    if svc_type == "backend":
        artifact_packaging = "jar"
    else:
        mvn_settings_absolute_path = create_maven_settings(maven_local_repository)
        write_github_env(mvn_settings_absolute_path, "MVN_SETTINGS_ABSOLUTE_PATH")
        if svc_type == "pipeline":
            maven_extra_args += f" --settings {mvn_settings_absolute_path} -U --no-transfer-progress -Dmaven.test.skip=true"
        if svc_type == "lambda":
            maven_extra_args += f" --settings {mvn_settings_absolute_path} -U --no-transfer-progress"           
    if not build_from_scratch:
        logger.debug(f"Nothing to build, exiting")
        return
    os.chdir(dir_to_build)
    artifact_version = os.getenv("DEPLOYED_ARTIFACT_VERSION", os.getenv("VERSION_TO_DEPLOY", ""))
    if not artifact_version:
        artifact_version = get_dev_version(env_name)
    else:
        run_command(f"yq -e -p=xml -o=xml '.project.properties.revision = \"{artifact_version}\"' -i pom.xml")
        logger.info(f"Updated pom.xml revision to {artifact_version}")
    artifact_dir, artifact_file = get_maven_artifact_dir_and_file(version=artifact_version, packaging=artifact_packaging, is_multi_service=is_multi_service, mvn_extra_args=maven_extra_args)
    logger.debug(f"artifact relative path is {os.path.join(maven_local_repository, artifact_dir, artifact_file)}")

    run_command(' '.join(cmd_part for cmd_part in [
        f"mvn -B clean {mvn_lifecycle}",
        sonar_args, mvn_profile,
        f"-Dmaven.repo.local={maven_local_repository}",
        f"-Drevision={artifact_version}",
        maven_extra_args] if cmd_part))

    if not wait_for_file(target_dir=os.path.join(maven_local_repository, artifact_dir), target_file_name=artifact_file):
        exit_on_error_and_write_summary(f"timed out waiting for artifact file creation")

    match svc_type:
        case "pipeline":
            if mvn_lifecycle == "install":
                logger.debug("cleanup S3 bucket")
                run_command(f"aws s3 rm s3://p81-{env_name}-env-files/jars/ --recursive --exclude \"*\" --include \"{dir_to_build}*\"")
                logger.debug("uploading artifact to S3 bucket")
                os.chdir(os.path.join(maven_local_repository, artifact_dir))
                run_command(f"aws s3 cp --quiet \"{artifact_file}\" s3://p81-{env_name}-env-files/jars/")
            write_github_env(os.path.join(maven_local_repository, artifact_dir, artifact_file), "ZIP_FILE")
            write_github_env(os.path.join("jars", artifact_file), "PLUGIN_ZIP_FILE_PATH")
            write_github_env(connector_name, "CONNECTOR_NAME")
            write_github_env(artifact_version, 'VERSION_TO_DEPLOY')
            write_github_env(artifact_version, 'PLUGIN_VERSION')
        case "lambda":
            write_github_env(os.path.join(maven_local_repository, artifact_dir, artifact_file), "ZIP_FILE")
            write_github_env(artifact_version, 'DEPLOYED_ARTIFACT_VERSION')
        case "backend":
            write_github_env(artifact_file, "JAR_NAME")
            write_github_env(artifact_version, 'VERSION_TO_DEPLOY')
    
    logger.info(f"{artifact_packaging} file created: {artifact_file} for deployment, version set: {artifact_version}")

if __name__ == "__main__":
    build_maven_artifact()
