// 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.

(function($, cloudStack) {

    cloudStack.uiCustom.healthCheck = function(args) {

        // Place outer args here as local variables
        // i.e, -- var dataProvider = args.dataProvider

        return function(args) {
            if (args.context.multiRules == undefined) { //LB rule is not created yet
                cloudStack.dialog.notice({
                    message: _l('Health Check can only be configured on a created LB rule')
                });
                return;
            }

            var formData = args.formData;
            var forms = $.extend(true, {}, args.forms);
            var topFieldForm, bottomFieldForm, $topFieldForm, $bottomFieldForm;
            var topfields = forms.topFields;

            var $healthCheckDesc = $('<div>Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check </div>').addClass('health-check-description');
            var $healthCheckConfigTitle = $('<div><br><br>Configuration Options :</div>').addClass('health-check-config-title');
            var $healthCheckAdvancedTitle = $('<div><br><br> Advanced Options : </div>').addClass('health-check-advanced-title');

            var $healthCheckDialog = $('<div>').addClass('health-check');
            $healthCheckDialog.append($healthCheckDesc);
            $healthCheckDialog.append($healthCheckConfigTitle);
            var $loadingOnDialog = $('<div>').addClass('loading-overlay');

            var policyObj = null;
            var pingpath1 = '/';
            var responsetimeout1 = '2';
            var healthinterval1 = '5';
            var healthythreshold1 = '2';
            var unhealthythreshold1 = '1';

            $.ajax({
                url: createURL('listLBHealthCheckPolicies'),
                data: {
                    lbruleid: args.context.multiRules[0].id
                },
                async: false,
                success: function(json) {
                    if (json.listlbhealthcheckpoliciesresponse.healthcheckpolicies[0].healthcheckpolicy[0] != undefined) {
                        policyObj = json.listlbhealthcheckpoliciesresponse.healthcheckpolicies[0].healthcheckpolicy[0];
                        pingpath1 = policyObj.pingpath; //API bug: API doesn't return it
                        responsetimeout1 = policyObj.responsetime;
                        healthinterval1 = policyObj.healthcheckinterval;
                        healthythreshold1 = policyObj.healthcheckthresshold;
                        unhealthythreshold1 = policyObj.unhealthcheckthresshold;
                    }
                }
            });

            topFieldForm = cloudStack.dialog.createForm({
                context: args.context,
                noDialog: true, // Don't render a dialog, just return $formContainer
                form: {
                    title: '',
                    fields: {
                        pingpath: {
                            label: 'Ping Path',
                            validation: {
                                required: false
                            },
                            defaultValue: pingpath1
                        }
                    }
                }
            });

            $topFieldForm = topFieldForm.$formContainer;
            $topFieldForm.appendTo($healthCheckDialog);

            $healthCheckDialog.append($healthCheckAdvancedTitle);

            bottomFieldForm = cloudStack.dialog.createForm({
                context: args.context,
                noDialog: true,
                form: {
                    title: '',
                    fields: {
                        responsetimeout: {
                            label: 'Response Timeout (in sec)',
                            validation: {
                                required: false
                            },
                            defaultValue: responsetimeout1
                        },
                        healthinterval: {
                            label: 'Health Check Interval (in sec)',
                            validation: {
                                required: false
                            },
                            defaultValue: healthinterval1
                        },
                        healthythreshold: {
                            label: 'Healthy Threshold',
                            validation: {
                                required: false
                            },
                            defaultValue: healthythreshold1
                        },
                        unhealthythreshold: {
                            label: 'Unhealthy Threshold',
                            validation: {
                                required: false
                            },
                            defaultValue: unhealthythreshold1
                        }
                    }
                }
            });

            $bottomFieldForm = bottomFieldForm.$formContainer;
            $bottomFieldForm.appendTo($healthCheckDialog);


            var buttons = [{
                text: _l('label.cancel'),
                'class': 'cancel',
                click: function() {
                    $healthCheckDialog.dialog('destroy');
                    $('.overlay').remove();
                }
            }];

            if (policyObj == null) { //policy is not created yet
                buttons.push({
                    text: _l('Create'),
                    'class': 'ok',
                    click: function() {
                        $loadingOnDialog.appendTo($healthCheckDialog);
                        var formData = cloudStack.serializeForm($healthCheckDialog.find('form'));
                        var data = {
                            lbruleid: args.context.multiRules[0].id,
                            pingpath: formData.pingpath,
                            responsetimeout: formData.responsetimeout,
                            intervaltime: formData.healthinterval,
                            healthythreshold: formData.healthythreshold,
                            unhealthythreshold: formData.unhealthythreshold
                        };

                        $.ajax({
                            url: createURL('createLBHealthCheckPolicy'),
                            data: data,
                            success: function(json) {
                                var jobId = json.createlbhealthcheckpolicyresponse.jobid;
                                var createLBHealthCheckPolicyIntervalId = setInterval(function() {
                                    $.ajax({
                                        url: createURL('queryAsyncJobResult'),
                                        data: {
                                            jobid: jobId
                                        },
                                        success: function(json) {
                                            var result = json.queryasyncjobresultresponse;
                                            if (result.jobstatus == 0) {
                                                return; //Job has not completed
                                            } else {
                                                clearInterval(createLBHealthCheckPolicyIntervalId);

                                                if (result.jobstatus == 1) {
                                                    cloudStack.dialog.notice({
                                                        message: _l('Health Check Policy has been created')
                                                    });
                                                    $loadingOnDialog.remove();
                                                    $healthCheckDialog.dialog('destroy');
                                                    $('.overlay').remove();
                                                } else if (result.jobstatus == 2) {
                                                    cloudStack.dialog.notice({
                                                        message: _s(result.jobresult.errortext)
                                                    });
                                                    $loadingOnDialog.remove();
                                                    $healthCheckDialog.dialog('destroy');
                                                    $('.overlay').remove();
                                                }
                                            }
                                        }
                                    });
                                }, g_queryAsyncJobResultInterval);
                            },

                            error: function(json) {

                                cloudStack.dialog.notice({
                                    message: _s(json.responseText)
                                }); //Error message in the API needs to be improved
                                $healthCheckDialog.dialog('close');
                                $('.overlay').remove();
                            }

                        });
                    }
                });
            } else { //policy exists already
                buttons.push(
                    //Update Button (begin) - call delete API first, then create API
                    {
                        text: _l('Update'),
                        'class': 'ok',
                        click: function() {
                            $loadingOnDialog.appendTo($healthCheckDialog);

                            $.ajax({
                                url: createURL('deleteLBHealthCheckPolicy'),
                                data: {
                                    id: policyObj.id
                                },
                                success: function(json) {
                                    var jobId = json.deletelbhealthcheckpolicyresponse.jobid;
                                    var deleteLBHealthCheckPolicyIntervalId = setInterval(function() {
                                        $.ajax({
                                            url: createURL('queryAsyncJobResult'),
                                            data: {
                                                jobid: jobId
                                            },
                                            success: function(json) {
                                                var result = json.queryasyncjobresultresponse;
                                                if (result.jobstatus == 0) {
                                                    return; //Job has not completed
                                                } else {
                                                    clearInterval(deleteLBHealthCheckPolicyIntervalId);

                                                    if (result.jobstatus == 1) {
                                                        var formData = cloudStack.serializeForm($healthCheckDialog.find('form'));
                                                        var data = {
                                                            lbruleid: args.context.multiRules[0].id,
                                                            pingpath: formData.pingpath,
                                                            responsetimeout: formData.responsetimeout,
                                                            intervaltime: formData.healthinterval,
                                                            healthythreshold: formData.healthythreshold,
                                                            unhealthythreshold: formData.unhealthythreshold
                                                        };

                                                        $.ajax({
                                                            url: createURL('createLBHealthCheckPolicy'),
                                                            data: data,
                                                            success: function(json) {
                                                                var jobId = json.createlbhealthcheckpolicyresponse.jobid;
                                                                var createLBHealthCheckPolicyIntervalId = setInterval(function() {
                                                                    $.ajax({
                                                                        url: createURL('queryAsyncJobResult'),
                                                                        data: {
                                                                            jobid: jobId
                                                                        },
                                                                        success: function(json) {
                                                                            var result = json.queryasyncjobresultresponse;
                                                                            if (result.jobstatus == 0) {
                                                                                return; //Job has not completed
                                                                            } else {
                                                                                clearInterval(createLBHealthCheckPolicyIntervalId);

                                                                                if (result.jobstatus == 1) {
                                                                                    cloudStack.dialog.notice({
                                                                                        message: _l('Health Check Policy has been updated')
                                                                                    });
                                                                                    $loadingOnDialog.remove();
                                                                                    $healthCheckDialog.dialog('destroy');
                                                                                    $('.overlay').remove();
                                                                                } else if (result.jobstatus == 2) {
                                                                                    cloudStack.dialog.notice({
                                                                                        message: _s(result.jobresult.errortext)
                                                                                    });
                                                                                    $loadingOnDialog.remove();
                                                                                    $healthCheckDialog.dialog('destroy');
                                                                                    $('.overlay').remove();
                                                                                }
                                                                            }
                                                                        }
                                                                    });
                                                                }, g_queryAsyncJobResultInterval);
                                                            }
                                                        });
                                                    } else if (result.jobstatus == 2) {
                                                        cloudStack.dialog.notice({
                                                            message: _s(result.jobresult.errortext)
                                                        });
                                                        $loadingOnDialog.remove();
                                                        $healthCheckDialog.dialog('destroy');
                                                        $('.overlay').remove();
                                                    }
                                                }
                                            }
                                        });
                                    }, g_queryAsyncJobResultInterval);
                                }
                            });
                        }
                    }
                    //Update Button (end)
                    ,
                    //Delete Button (begin) - call delete API
                    {
                        text: _l('Delete'),
                        'class': 'delete',
                        click: function() {
                            $loadingOnDialog.appendTo($healthCheckDialog);

                            $.ajax({
                                url: createURL('deleteLBHealthCheckPolicy'),
                                data: {
                                    id: policyObj.id
                                },
                                success: function(json) {
                                    var jobId = json.deletelbhealthcheckpolicyresponse.jobid;
                                    var deleteLBHealthCheckPolicyIntervalId = setInterval(function() {
                                        $.ajax({
                                            url: createURL('queryAsyncJobResult'),
                                            data: {
                                                jobid: jobId
                                            },
                                            success: function(json) {
                                                var result = json.queryasyncjobresultresponse;
                                                if (result.jobstatus == 0) {
                                                    return; //Job has not completed
                                                } else {
                                                    clearInterval(deleteLBHealthCheckPolicyIntervalId);

                                                    if (result.jobstatus == 1) {
                                                        cloudStack.dialog.notice({
                                                            message: _l('Health Check Policy has been deleted')
                                                        });
                                                        $loadingOnDialog.remove();
                                                        $healthCheckDialog.dialog('destroy');
                                                        $('.overlay').remove();
                                                    } else if (result.jobstatus == 2) {
                                                        cloudStack.dialog.notice({
                                                            message: _s(result.jobresult.errortext)
                                                        });
                                                        $loadingOnDialog.remove();
                                                        $healthCheckDialog.dialog('destroy');
                                                        $('.overlay').remove();
                                                    }
                                                }
                                            }
                                        });
                                    }, g_queryAsyncJobResultInterval);
                                }
                            });
                        }
                    }
                    //Delete Button (end)
                );
            }

            $healthCheckDialog.dialog({
                title: 'Health Check Wizard',
                width: 600,
                height: 600,
                draggable: true,
                closeonEscape: false,
                overflow: 'auto',
                open: function() {
                    $("button").each(function() {
                        $(this).attr("style", "left: 400px; position: relative; margin-right: 5px; ");
                    });

                    $('.ui-dialog .delete').css('left', '140px');

                },
                buttons: buttons
            }).closest('.ui-dialog').overlay();

        }
    }
}(jQuery, cloudStack));
