"use strict";

const CloudControllerBase = require("./CloudControllerBase");

/**
 * Manages Service Instances on Cloud Foundry
 */
class ServiceInstances extends CloudControllerBase {

    /**
     * @param {String} endPoint [CC endpoint]
     * @constructor
     * @returns {void}
     */
    constructor(endPoint) {
        super(endPoint);
    }

    /**
     * Get Service Instances
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/list_all_service_instances.html}
     *
     * @param  {String} filter [query string]
     * @return {JSON}              [return a JSON response]
     */
    getInstances (filter) {

        const url = `${this.API_URL}/v2/service_instances`;
        let qs = {};

        if (filter) {
            qs = filter;
        }
        const options = {
            method: "GET",
            url: url,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            },
            qs: qs
        };

        return this.REST.request(options, this.HttpStatus.OK, true);
    }

    /**
     * Get a Service Instance
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/retrieve_a_particular_service_instance.html}
     *
     * @param  {String} guid         [servicePlan guid]
     * @return {JSON}              [return a JSON response]
     */
    getInstance (guid) {

        const url = `${this.API_URL}/v2/service_instances/${guid}`;
        const options = {
            method: "GET",
            url: url,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            }
        };

        return this.REST.request(options, this.HttpStatus.OK, true);
    }

    /**
     * Get a Service Instance Permissions
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/retrieving_permissions_on_a_service_instance.html}
     *
     * @param  {String} guid         [servicePlan guid]
     * @return {JSON}              [return a JSON response]
     */
    getInstancePermissions (guid) {

        const url = `${this.API_URL}/v2/service_instances/${guid}/permissions`;
        const options = {
            method: "GET",
            url: url,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            }
        };

        return this.REST.request(options, this.HttpStatus.OK, true);
    }

    /**
     * Get a Service Instance Bindings
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/list_all_service_bindings_for_the_service_instance.html}
     *
     * @param  {String} guid         [servicePlan guid]
     * @return {JSON}              [return a JSON response]
     */
    getInstanceBindings (guid) {

        const url = `${this.API_URL}/v2/service_instances/${guid}/service_bindings`;
        const options = {
            method: "GET",
            url: url,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            }
        };

        return this.REST.request(options, this.HttpStatus.OK, true);
    }

    /**
     * Get a Service Instance Routes
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/list_all_routes_for_the_service_instance.html}
     *
     * @param  {String} guid         [servicePlan guid]
     * @return {JSON}              [return a JSON response]
     */
    getInstanceRoutes (guid) {

        const url = `${this.API_URL}/v2/service_instances/${guid}/routes`;
        const options = {
            method: "GET",
            url: url,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            }
        };

        return this.REST.request(options, this.HttpStatus.OK, true);
    }

    /**
     * Create a Service Instance
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/creating_a_service_instance.html}
     *
     * @param  {JSON} appOptions   [options to create the application]
     * @return {JSON}              [return a JSON response]
     */
    create (appOptions) {

        const url = `${this.API_URL}/v2/service_instances`;
        const options = {
            method: "POST",
            url: url,
            headers: {
                "Content-Type": "application/x-www-form-urlencoded",
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            },
            form: JSON.stringify(appOptions)
        };

        return this.REST.request(options, this.HttpStatus.CREATED, true);
    }

    /**
     * Remove a Service Instance
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/delete_a_service_instance.html}
     *
     * @param  {String} guid [Service Instance guid]
     * @return {JSON}              [return a JSON response]
     */
    remove (guid) {

        const url = `${this.API_URL}/v2/service_instances/${guid}`;
        const options = {
            method: "DELETE",
            url: url,
            headers: {
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            }
        };

        return this.REST.request(options, this.HttpStatus.NO_CONTENT, false);
    }

     /**
     * Update an Service Instance
     * {@link https://apidocs.cloudfoundry.org/226/service_instances/update_a_service_instance.html}
     *
     * @param  {String} serviceInstanceGuid     [service instance guid]
     * @param  {JSON} serviceInstanceOptions   [options to update the instance]
     * @return {JSON}              [information about the instance]
     */
    update (serviceInstanceGuid, serviceInstanceOptions) {

        const url = `${this.API_URL}/v2/service_instances/${serviceInstanceGuid}`;
        const options = {
            method: "PUT",
            url: url,
            headers: {
                "Content-Type": "application/x-www-form-urlencoded",
                Authorization: `${this.UAA_TOKEN.token_type} ${this.UAA_TOKEN.access_token}`
            },
            form: JSON.stringify(serviceInstanceOptions)
        };

        return this.REST.request(options, this.HttpStatus.CREATED, true);
    }

}

module.exports = ServiceInstances;
