/*
 * Copyright (c) 2015 EMC Corporation
 * All Rights Reserved
 */
package com.emc.vipr.client;

import com.emc.vipr.client.core.Backup;
import com.emc.vipr.client.impl.RestClient;
import com.emc.vipr.client.system.CallHome;
import com.emc.vipr.client.system.Config;
import com.emc.vipr.client.system.Control;
import com.emc.vipr.client.system.HealthMonitor;
import com.emc.vipr.client.system.IPsec;
import com.emc.vipr.client.system.Licensing;
import com.emc.vipr.client.system.Logs;
import com.emc.vipr.client.system.Password;
import com.emc.vipr.client.system.Upgrade;

public class ViPRSystemClient {
    protected RestClient client;

    // for easy mocking in UT
    public ViPRSystemClient() {}
    /**
     * Convenience method for calling constructor with new ClientConfig().withHost(host)
     * 
     * @param host Hostname or IP address for the Virtual IP of the target environment.
     */
    public ViPRSystemClient(String host) {
        this(new ClientConfig().withHost(host));
    }

    /**
     * Convenience method for calling constructor with new ClientConfig().withHost(host).withIgnoringCertificates(ignoreCertificates)
     * 
     * @param host Hostname or IP address for the Virtual IP of the target environment.
     * @param ignoreCertificates True if SSL certificates should be ignored.
     */
    public ViPRSystemClient(String host, boolean ignoreCertificates) {
        this(new ClientConfig().withHost(host).withIgnoringCertificates(ignoreCertificates));
    }

    public ViPRSystemClient(ClientConfig config) {
        this.client = config.newClient();
    }

    /**
     * Sets the authentication token to be used for this client.
     * 
     * @param authToken The authentication token to set.
     */
    public void setAuthToken(String authToken) {
        client.setAuthToken(authToken);
    }

    /**
     * Sets the authentication token and returns the updated client.
     * 
     * @see #setAuthToken(String)
     * @param token The authentication token to set.
     * @return The updated client.
     */
    public ViPRSystemClient withAuthToken(String token) {
        setAuthToken(token);
        return this;
    }

    /**
     * Performs an authentication login and returns the updated client.
     * 
     * @see AuthClient#login(String, String)
     * @param username The username.
     * @param password The password.
     * @return The updated client.
     */
    public ViPRSystemClient withLogin(String username, String password) {
        auth().login(username, password);
        return this;
    }

    public AuthClient auth() {
        return new AuthClient(client);
    }

    public CallHome callHome() {
        return new CallHome(client);
    }

    public Config config() {
        return new Config(client);
    }

    public Control control() {
        return new Control(client);
    }

    public HealthMonitor health() {
        return new HealthMonitor(client);
    }

    public Licensing license() {
        return new Licensing(client);
    }

    public Logs logs() {
        return new Logs(client);
    }

    public Password password() {
        return new Password(client);
    }

    public Upgrade upgrade() {
        return new Upgrade(client);
    }
    
    public Backup backup(){
    	return new Backup(client);
    }

    public IPsec ipsec(){
        return new IPsec(client);

    }
}
