/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package com.epam.dlab.automation.helper;

import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Paths;
import java.util.Properties;

public class PropertiesResolver {

    private static final Logger LOGGER = LogManager.getLogger(PropertiesResolver.class);
    public static final boolean DEV_MODE;
	private static final String CONFIG_FILE_NAME = "application.properties";
	public static final String NOTEBOOK_SCENARIO_FILES_LOCATION_PROPERTY_TEMPLATE = "scenario.%s.files.location";
	public static final String NOTEBOOK_TEST_TEMPLATES_LOCATION = "%s.test.templates.location";
	public static final String NOTEBOOK_CONFIGURATION_FILE_TEMPLATE = "%s/%s-notebook.json";

    //keys from application.properties(dev-application.properties)
	private static final String CONF_FILE_LOCATION_PROPERTY = "conf.file.location";
	private static final String KEYS_DIRECTORY_LOCATION_PROPERTY = "keys.directory.location";
	private static final String NOTEBOOK_TEST_DATA_COPY_SCRIPT = "notebook.test.data.copy.script";
	private static final String NOTEBOOK_TEST_LIB_LOCATION = "notebook.test.lib.location";

	private static final String SCENARIO_JUPYTER_FILES_LOCATION_PROPERTY = "scenario.jupyter.files.location";
	private static final String SCENARIO_RSTUDIO_FILES_LOCATION_PROPERTY = "scenario.rstudio.files.location";
	private static final String SCENARIO_ZEPPELIN_FILES_LOCATION_PROPERTY = "scenario.zeppelin.files.location";
	private static final String SCENARIO_TENSOR_FILES_LOCATION_PROPERTY = "scenario.tensor.files.location";
	private static final String SCENARIO_DEEPLEARNING_FILES_LOCATION_PROPERTY = "scenario.deeplearning.files.location";

	private static final String JUPYTER_TEST_TEMPLATES_LOCATION_PROPERTY = "jupyter.test.templates.location";
	private static final String RSTUDIO_TEST_TEMPLATES_LOCATION_PROPERTY = "rstudio.test.templates.location";
	private static final String ZEPPELIN_TEST_TEMPLATES_LOCATION_PROPERTY = "zeppelin.test.templates.location";
	private static final String TENSOR_TEST_TEMPLATES_LOCATION_PROPERTY = "tensor.test.templates.location";
	private static final String DEEPLEARNING_TEST_TEMPLATES_LOCATION_PROPERTY = "deeplearning.test.templates.location";

	private static final String CLUSTER_CONFIG_FILE_LOCATION_PROPERTY = "ec2.config.files.location";
	private static final String AZURE_CONFIG_FILE_LOCATION_PROPERTY = "azure.config.files.location";
	private static final String GCP_CONFIG_FILE_LOCATION_PROPERTY = "gcp.config.files.location";

	private PropertiesResolver() {
	}

    public static String getJupyterTestTemplatesLocationProperty() {
        return JUPYTER_TEST_TEMPLATES_LOCATION_PROPERTY;
    }

    public static String getRstudioTestTemplatesLocationProperty() {
        return RSTUDIO_TEST_TEMPLATES_LOCATION_PROPERTY;
    }

    public static String getZeppelinTestTemplatesLocationProperty() {
        return ZEPPELIN_TEST_TEMPLATES_LOCATION_PROPERTY;
    }

    public static String getTensorTestTemplatesLocationProperty() {
        return TENSOR_TEST_TEMPLATES_LOCATION_PROPERTY;
    }

    public static String getDeeplearningTestTemplatesLocationProperty() {
        return DEEPLEARNING_TEST_TEMPLATES_LOCATION_PROPERTY;
    }

    private static Properties properties = new Properties();

    static {
        DEV_MODE = System.getProperty("run.mode", "remote").equalsIgnoreCase("dev");
        loadApplicationProperties();
    }

	private static String getProperty(String propertyName, boolean isOptional) {
		String s = System.getProperty(propertyName, "");
		if (s.isEmpty() && !isOptional) {
        	throw new IllegalArgumentException("Missed required JVM argument -D" + propertyName);
        }
        return s;
	}
	
	public static void overlapProperty(Properties props, String propertyName, boolean isOptional) {
		String argName = StringUtils.replaceChars(propertyName, '_', '.').toLowerCase();
		String s = System.getProperty(argName, "");
		if (!s.isEmpty()) {
            props.setProperty(propertyName, s);
        }
		if(!isOptional && props.getProperty(propertyName, "").isEmpty()) {
        	throw new IllegalArgumentException("Missed required argument -D" + argName + " or property " + propertyName);
        }
	}


    private static String getConfRootPath() {
    	return getProperty("conf.root.path", false);
    }

    private static void loadApplicationProperties() {
        InputStream input = null;

        try {
            input = PropertiesResolver.class.getClassLoader().getResourceAsStream(CONFIG_FILE_NAME);

            // load a properties file
            properties.load(input);
            String rootPath = getConfRootPath();
            for (String key : properties.keySet().toArray(new String[0])) {
            	String path = StringUtils.replace(properties.getProperty(key), "${CONF_ROOT_PATH}", rootPath);
            	path = Paths.get(path).toAbsolutePath().toString();
            	properties.setProperty(key, path);
            }
            overlapProperty(properties, CONF_FILE_LOCATION_PROPERTY, false);

            // get the property value and print it out
            LOGGER.info(properties.getProperty(CONF_FILE_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(KEYS_DIRECTORY_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(NOTEBOOK_TEST_DATA_COPY_SCRIPT));
            LOGGER.info(properties.getProperty(NOTEBOOK_TEST_LIB_LOCATION));
            LOGGER.info(properties.getProperty(SCENARIO_JUPYTER_FILES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(SCENARIO_RSTUDIO_FILES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(SCENARIO_ZEPPELIN_FILES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(SCENARIO_TENSOR_FILES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(SCENARIO_DEEPLEARNING_FILES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(JUPYTER_TEST_TEMPLATES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(RSTUDIO_TEST_TEMPLATES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(ZEPPELIN_TEST_TEMPLATES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(TENSOR_TEST_TEMPLATES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(DEEPLEARNING_TEST_TEMPLATES_LOCATION_PROPERTY));
            LOGGER.info(properties.getProperty(CLUSTER_CONFIG_FILE_LOCATION_PROPERTY));

        } catch (IOException ex) {
            LOGGER.error(ex);
            LOGGER.error("Application configuration file could not be found by the path: {}", CONFIG_FILE_NAME);
            System.exit(0);
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    LOGGER.error(e);
                    LOGGER.error("Application configuration file could not be found by the path: {}", CONFIG_FILE_NAME);
                }
            }
        }
    }


    public static String getConfFileLocation() {
        return properties.getProperty(CONF_FILE_LOCATION_PROPERTY);
    }

    public static String getKeysLocation() {
        return properties.getProperty(KEYS_DIRECTORY_LOCATION_PROPERTY);
    }

    public static String getNotebookTestDataCopyScriptLocation() {
        return properties.getProperty(NOTEBOOK_TEST_DATA_COPY_SCRIPT);
    }

    public static String getNotebookTestLibLocation() {
        return properties.getProperty(NOTEBOOK_TEST_LIB_LOCATION);
    }

    public static String getScenarioJupyterFilesLocation() {
        return properties.getProperty(SCENARIO_JUPYTER_FILES_LOCATION_PROPERTY);
    }

    public static String getScenarioRstudioFilesLocation() {
        return properties.getProperty(SCENARIO_RSTUDIO_FILES_LOCATION_PROPERTY);
    }

    public static String getScenarioZeppelinFilesLocation() {
        return properties.getProperty(SCENARIO_ZEPPELIN_FILES_LOCATION_PROPERTY);
    }

    public static String getScenarioTensorFilesLocation() {
        return properties.getProperty(SCENARIO_TENSOR_FILES_LOCATION_PROPERTY);
    }

    public static String getScenarioDeeplearningFilesLocation() {
        return properties.getProperty(SCENARIO_DEEPLEARNING_FILES_LOCATION_PROPERTY);
    }

    public static String getClusterEC2ConfFileLocation() {
        return properties.getProperty(CLUSTER_CONFIG_FILE_LOCATION_PROPERTY );
    }

    public static String getClusterAzureConfFileLocation() {
        return properties.getProperty(AZURE_CONFIG_FILE_LOCATION_PROPERTY );
    }

    public static String getClusterGcpConfFileLocation() {
        return properties.getProperty(GCP_CONFIG_FILE_LOCATION_PROPERTY);
    }

    public static String getPropertyByName(String propertyName) {
        return properties.getProperty(propertyName);
    }
}
