/**
 * 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
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * 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.kerby.has.client;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.client.urlconnection.HTTPSProperties;
import org.apache.kerby.has.common.HasConfig;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.glassfish.jersey.SslConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * HAS client API for applications to interact with HAS server
 */
public class HasInitClient {

    public static final Logger LOG = LoggerFactory.getLogger(HasInitClient.class);

    private HasConfig hasConfig;
    private File confDir;

    public HasInitClient(HasConfig hasConfig, File confDir) {
        this.hasConfig = hasConfig;
        this.confDir = confDir;
    }

    public File getConfDir() {
        return confDir;
    }

    private WebResource getWebResource(String restName) {
        Client client;
        String server = null;
        if (hasConfig.getHttpsPort() != null && hasConfig.getHttpsHost() != null) {
            server = "https://" + hasConfig.getHttpsHost() + ":" + hasConfig.getHttpsPort()
                    + "/has/v1/" + restName;
            LOG.info("Admin request url: " + server);
            HasConfig conf = new HasConfig();
            try {
                conf.addIniConfig(new File(hasConfig.getSslClientConf()));
            } catch (IOException e) {
                throw new RuntimeException("Errors occurred when adding ssl conf. "
                    + e.getMessage());
            }
            SslConfigurator sslConfigurator = SslConfigurator.newInstance()
                    .trustStoreFile(conf.getString("ssl.client.truststore.location"))
                    .trustStorePassword(conf.getString("ssl.client.truststore.password"));
            sslConfigurator.securityProtocol("SSL");
            SSLContext sslContext = sslConfigurator.createSSLContext();
            ClientConfig clientConfig = new DefaultClientConfig();
            clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
                    new HTTPSProperties(new HostnameVerifier() {
                        @Override
                        public boolean verify(String s, SSLSession sslSession) {
                            return false;
                        }
                    }, sslContext));
            client = Client.create(clientConfig);
        } else {
            client = Client.create();
        }
        if (server == null) {
            throw new RuntimeException("Please set the https address and port.");
        }
        return client.resource(server);
    }

    public void startKdc() {
        WebResource webResource = getWebResource("init/kdcstart");
        ClientResponse response = webResource.get(ClientResponse.class);
        try {
            JSONObject result = new JSONObject(response.getEntity(String.class));
            if (result.getString("result").equals("success")) {
                System.out.println(result.getString("msg"));
            } else {
                System.err.println(result.getString("msg"));
            }
        } catch (JSONException e) {
            System.err.println(e.getMessage());
        }
    }

    public InputStream initKdc() {
        WebResource webResource = getWebResource("init/kdcinit");
        ClientResponse response = webResource.get(ClientResponse.class);
        if (response.getStatus() == 200) {
            return response.getEntityInputStream();
        }
        return null;
    }
}
