/*
 * Licensed 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 org.apache.karaf.management.mbeans.dev.internal;

import org.apache.felix.utils.properties.Properties;
import org.apache.karaf.management.mbeans.dev.DevMBean;
import org.osgi.framework.BundleContext;

import javax.management.NotCompliantMBeanException;
import javax.management.StandardMBean;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Scanner;

/**
 * Implementation of the DevMBean.
 */
public class DevMBeanImpl extends StandardMBean implements DevMBean {

    private BundleContext bundleContext;

    public DevMBeanImpl() throws NotCompliantMBeanException {
        super(DevMBean.class);
    }

    public BundleContext getBundleContext() {
        return this.bundleContext;
    }

    public void setBundleContext(BundleContext bundleContext) {
        this.bundleContext = bundleContext;
    }

    public String framework() throws Exception {
        if (bundleContext.getBundle(0).getSymbolicName().contains("felix")) {
            return "Felix";
        } else {
            return "Equinox";
        }
    }

    public void frameworkOptions(boolean debug, String framework) throws Exception {
        Properties properties = new Properties(new File(System.getProperty("karaf.base"), "etc/config.properties"));
        if (framework != null) {
            // swtich the framework is use
            if (!framework.equalsIgnoreCase("felix") && !framework.equalsIgnoreCase("equinox")) {
                throw new IllegalArgumentException("Unsupported framework " + framework);
            }
            properties.put("karaf.framework", framework.toLowerCase());
        }
        if (framework == null) {
            if (bundleContext.getBundle(0).getSymbolicName().contains("felix")) {
                framework = "felix";
            } else {
                framework = "equinox";
            }
        }
        if (framework.equals("felix")) {
            properties.put("felix.log.level", "4");
        } else {
            properties.put("osgi.debug", "etc/equinox-debug.properties");
            // TODO populate the equinox-debug.properties file with the one provided in shell/dev module
        }
        properties.save();
    }

    public void restart(boolean clean) throws Exception {
        System.setProperty("karaf.restart", "true");
        System.setProperty("karaf.restart.clean", Boolean.toString(clean));
        bundleContext.getBundle(0).stop();
    }

}
