#!python

# *****************************************************************************
# Copyright (c) 2024 IBM Corporation and other Contributors.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# *****************************************************************************

from mas.devops.pre_install import applyPreInstallMASRBAC
from kubernetes import client, config
from kubernetes.config.config_exception import ConfigException
from openshift.dynamic import DynamicClient
import sys
import argparse
import logging
import urllib3

urllib3.disable_warnings()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Apply Pre-Install MAS RBAC")

    parser.add_argument("--mas-instance-id", required=True, help="MAS Instance ID")
    parser.add_argument("--mas-version", required=True, help="MAS Version (e.g., 9.2)")
    parser.add_argument(
        "--admin-mode",
        required=False,
        default="namespaced",
        choices=["cluster", "namespaced", "minimal"],
        help="Admin mode: cluster, namespaced, or minimal",
    )
    parser.add_argument(
        "--selected-apps",
        required=False,
        default="core",
        help="Comma-separated list of apps (e.g., core,manage,iot)",
    )
    parser.add_argument(
        "--rbac-root-dir",
        required=False,
        default="/opt/app-root/rbac",
        help="Root directory containing RBAC manifests",
    )
    parser.add_argument(
        "--log-level",
        required=False,
        choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
        default="INFO",
    )

    args = parser.parse_args()

    # Setup logging
    log_level = getattr(logging, args.log_level)
    logger = logging.getLogger()
    logger.setLevel(log_level)

    ch = logging.StreamHandler()
    ch.setLevel(log_level)
    chFormatter = logging.Formatter(
        "%(asctime)-25s %(name)-50s %(levelname)-8s %(message)s"
    )
    ch.setFormatter(chFormatter)
    logger.addHandler(ch)

    mas_instance_id = args.mas_instance_id
    mas_version = ".".join(args.mas_version.split(".")[:2])
    admin_mode = args.admin_mode
    selected_apps_str = args.selected_apps
    rbac_root_dir = args.rbac_root_dir

    # Parse selected apps
    selected_apps = None
    if selected_apps_str:
        selected_apps = [
            app.strip() for app in selected_apps_str.split(",") if app.strip()
        ]

    logger.info("Configuration:")
    logger.info("--------------")
    logger.info(f"mas_instance_id: {mas_instance_id}")
    logger.info(f"mas_version:     {mas_version}")
    logger.info(f"admin_mode:      {admin_mode}")
    logger.info(f"selected_apps:   {selected_apps}")
    logger.info(f"rbac_root_dir:   {rbac_root_dir}")
    logger.info(f"log_level:       {log_level}")
    logger.info("")

    try:
        # Try to load in-cluster configuration
        config.load_incluster_config()
        logger.debug("Loaded in-cluster configuration")
    except ConfigException:
        # If that fails, fall back to kubeconfig file
        config.load_kube_config()
        logger.debug("Loaded kubeconfig file")

    try:
        dynClient = DynamicClient(client.api_client.ApiClient())
        applyPreInstallMASRBAC(
            dynClient=dynClient,
            masVersion=mas_version,
            masInstanceId=mas_instance_id,
            adminMode=admin_mode,
            selectedApps=selected_apps,
            rbacRootDir=rbac_root_dir,
        )
        logger.info("Pre-Install MAS RBAC applied successfully")
        sys.exit(0)
    except Exception as e:
        logger.error(f"Error applying Pre-Install MAS RBAC: {e}")
        import traceback

        traceback.print_exc()
        sys.exit(1)
