'use strict';

angular.module('yardStickGui2App')
    .controller('ProjectDetailController', ['$scope', '$state', '$stateParams', 'mainFactory', 'Upload', 'toaster', 'ngDialog', '$localStorage', '$loading', '$interval',
        function($scope, $state, $stateParams, mainFactory, Upload, toaster, ngDialog, $localStorage, $loading, $interval) {


            init();
            // $scope.taskListDisplay = [];
            $scope.blisterPackTemplates = [{ id: 1, name: "Test Case" }, { id: 2, name: "Test Suite" }]
            $scope.selectType = null;
            $scope.ifHasEnv = false;
            $scope.ifHasCase = false;
            $scope.ifHasSuite = false;
            $scope.$on('$destroy', function() {
                $interval.cancel($scope.intervalCount)
            });
            $scope.finalTaskListDisplay = [];


            function init() {


                getProjectDetail();

                $scope.openCreate = openCreate;
                $scope.createTask = createTask;
                $scope.constructTestSuit = constructTestSuit;
                $scope.addEnvToTask = addEnvToTask;
                $scope.triggerContent = triggerContent;
                $scope.constructTestCase = constructTestCase;
                $scope.getTestDeatil = getTestDeatil;
                $scope.confirmAddCaseOrSuite = confirmAddCaseOrSuite;
                $scope.runAtask = runAtask;
                $scope.gotoDetail = gotoDetail;
                $scope.gotoReport = gotoReport;
                $scope.gotoModify = gotoModify;
                $scope.goBack = goBack;
                $scope.goToExternal = goToExternal;


            }

            function getProjectDetail() {
                if ($scope.intervalCount != undefined) {
                    $interval.cancel($scope.intervalCount);
                }
                $loading.start('key');
                $scope.taskListDisplay = [];
                $scope.finalTaskListDisplay = [];
                mainFactory.getProjectDetail().get({
                    project_id: $stateParams.projectId
                }).$promise.then(function(response) {
                    $loading.finish('key');
                    if (response.status == 1) {

                        $scope.projectData = response.result.project;
                        if ($scope.projectData.tasks.length != 0) {


                            for (var i = 0; i < $scope.projectData.tasks.length; i++) {
                                getDetailTaskForList($scope.projectData.tasks[i]);
                            }
                            $scope.intervalCount = $interval(function() {
                                getDetailForEachTask();
                            }, 10000);
                        } else {

                            if ($scope.intervalCount != undefined) {
                                $interval.cancel($scope.intervalCount);
                            }
                        }
                    } else {

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            // function getProjectDetailSimple() {
            //     getDetailForEachTask();
            // }

            function openCreate() {
                $scope.newUUID = null;
                $scope.displayEnvName = null;
                $scope.selectEnv = null;
                $scope.selectCase = null;
                $scope.selectType = null;
                $scope.contentInfo = null;
                $scope.ifHasEnv = false;
                $scope.ifHasCase = false;
                $scope.ifHasSuite = false;

                // getEnvironmentList();
                $scope.selectEnv = null;
                ngDialog.open({
                    template: 'views/modal/taskCreate.html',
                    scope: $scope,
                    className: 'ngdialog-theme-default',
                    width: 800,
                    showClose: true,
                    closeByDocument: false,
                    preCloseCallback: function(value) {
                        getProjectDetail();
                    },
                })
            }

            function createTask(name) {
                mainFactory.createTask().post({
                    'action': 'create_task',
                    'args': {
                        'name': name,
                        'project_id': $stateParams.projectId
                    }
                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        toaster.pop({
                            type: 'success',
                            title: 'create task success',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                        $scope.newUUID = response.result.uuid;
                        getEnvironmentList();

                    } else {
                        toaster.pop({
                            type: 'error',
                            title: 'create task wrong',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                    }



                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'create task wrong',
                        body: 'you can go next step',
                        timeout: 3000
                    });
                })
            }

            function getDetailTaskForList(id) {

                mainFactory.getTaskDetail().get({
                    'taskId': id
                }).$promise.then(function(response) {

                    if (response.status == 1) {
                        if (response.result.task.status == -1) {
                            response.result.task['stausWidth'] = '5%';
                        } else if (response.result.task.status == 0) {
                            response.result.task['stausWidth'] = '50%';
                        } else if (response.result.task.status == 1) {
                            response.result.task['stausWidth'] = '100%';
                        } else if (response.result.task.status == 2) {
                            response.result.task['stausWidth'] = 'red';
                        }
                        $scope.taskListDisplay.push(response.result.task);
                        console.log($scope.taskListDisplay);

                        $scope.finalTaskListDisplay = $scope.taskListDisplay;

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            function getDetailTaskForListSimple(id, index) {

                mainFactory.getTaskDetail().get({
                    'taskId': id
                }).$promise.then(function(response) {

                    if (response.status == 1) {
                        if (response.result.task.status == -1) {

                            $scope.finalTaskListDisplay[index].stausWidth = '5%';
                            $scope.finalTaskListDisplay[index].status = response.result.task.status;
                        } else if (response.result.task.status == 0) {

                            $scope.finalTaskListDisplay[index].stausWidth = '50%';
                            $scope.finalTaskListDisplay[index].status = response.result.task.status;
                        } else if (response.result.task.status == 1) {

                            $scope.finalTaskListDisplay[index].stausWidth = '100%';
                            $scope.finalTaskListDisplay[index].status = response.result.task.status;
                        } else if (response.result.task.status == 2) {

                            $scope.finalTaskListDisplay[index].stausWidth = 'red';
                            $scope.finalTaskListDisplay[index].status = response.result.task.status;
                        }


                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            function getDetailForEachTask() {
                for (var i = 0; i < $scope.finalTaskListDisplay.length; i++) {
                    if ($scope.finalTaskListDisplay[i].status != 1 && $scope.finalTaskListDisplay[i].status != -1) {
                        getDetailTaskForListSimple($scope.finalTaskListDisplay[i].uuid, i);
                    }
                }
            }

            function getEnvironmentList() {
                mainFactory.getEnvironmentList().get().$promise.then(function(response) {
                    $scope.environmentList = response.result.environments;
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            function constructTestSuit(id, name) {
                $scope.displayEnvName = name;
                $scope.selectEnv = id;

            }

            function constructTestCase(name) {

                $scope.selectCase = name;
                if ($scope.selectType.name == 'Test Case') {
                    getCaseInfo();
                } else {
                    getSuiteInfo();
                }

            }




            function addEnvToTask() {
                mainFactory.taskAddEnv().put({
                    'taskId': $scope.newUUID,
                    'action': 'add_environment',
                    'args': {
                        'task_id': $scope.newUUID,
                        'environment_id': $scope.selectEnv
                    }
                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        toaster.pop({
                            type: 'success',
                            title: 'add environment success',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                        $scope.ifHasEnv = true;


                    } else {
                        toaster.pop({
                            type: 'error',
                            title: 'create task wrong',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                    }



                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'create task wrong',
                        body: 'you can go next step',
                        timeout: 3000
                    });
                })
            }

            function triggerContent(name) {
                $scope.selectCase = null;
                $scope.displayTable = true;

                $scope.selectType = name;
                if (name.name == 'Test Case') {
                    getTestcaseList();
                } else if (name.name == 'Test Suite') {
                    getsuiteList();
                }
            }

            function getTestcaseList() {
                mainFactory.getTestcaselist().get({

                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        $scope.testcaselist = response.result;


                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });
                })
            }

            function getsuiteList() {
                mainFactory.suiteList().get({

                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        $scope.testsuitlist = response.result.testsuites;

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });
                })
            }

            function getTestDeatil() {


                if ($scope.selectType.name == 'Test Case') {
                    getTestcaseDetail();
                } else {
                    getSuiteDetail();
                }

            }

            function getCaseInfo() {



                mainFactory.getTestcaseDetail().get({
                    'testcasename': $scope.selectCase

                }).$promise.then(function(response) {
                    if (response.status == 1) {

                        $scope.contentInfo = response.result.testcase;

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });
                })
            }

            function getSuiteInfo() {
                mainFactory.suiteDetail().get({
                    'suiteName': $scope.selectCase.split('.')[0]

                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        $scope.contentInfo = response.result.testsuite;

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });
                })
            }


            function getSuiteDetail() {
                mainFactory.suiteDetail().get({
                    'suiteName': $scope.selectCase.split('.')[0]

                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        $scope.displayTable = false;
                        $scope.contentInfo = response.result.testsuite;

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });
                })
            }


            function getTestcaseDetail() {
                mainFactory.getTestcaseDetail().get({
                    'testcasename': $scope.selectCase

                }).$promise.then(function(response) {
                    if (response.status == 1) {

                        $scope.displayTable = false;
                        $scope.contentInfo = response.result.testcase;
                        $scope.optionalParams = response.result.args;

                    }
                }, function(error) {
                    mainFactory.errorHandler2(error);
                })
            }


            function addParamsToTask(){
                var params = {}
                angular.forEach($scope.optionalParams, function(value, name){
                    if(value.value){
                        params[name] = value.value;
                    }
                });

                mainFactory.taskAddParams().put({
                    'taskId': $scope.newUUID,
                    'action': 'add_params',
                    'args': {
                        'params': params
                    }
                }).$promise.then(function(resp) {
                    if (resp.status == 1) {
                    } else {
                        mainFactory.errorHandler1(resp);
                    }
                }, function(error) {
                    mainFactory.errorHandler2(error);
                })
            }

            function addCasetoTask(content) {
                mainFactory.taskAddEnv().put({
                    'taskId': $scope.newUUID,
                    'action': 'add_case',
                    'args': {
                        'task_id': $scope.newUUID,
                        'case_name': $scope.selectCase,
                        'case_content': content
                    }
                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        toaster.pop({
                            type: 'success',
                            title: 'add test case success',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                        $scope.ifHasCase = true;


                    } else {
                        toaster.pop({
                            type: 'error',
                            title: 'create task wrong',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'create task wrong',
                        body: 'you can go next step',
                        timeout: 3000
                    });
                })
            }

            function addSuitetoTask(content) {
                mainFactory.taskAddEnv().put({
                    'taskId': $scope.newUUID,
                    'action': 'add_suite',
                    'args': {
                        'task_id': $scope.newUUID,
                        'suite_name': $scope.selectCase.split('.')[0],
                        'suite_content': content
                    }
                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        toaster.pop({
                            type: 'success',
                            title: 'add test suite success',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                        $scope.ifHasSuite = true;


                    } else {
                        toaster.pop({
                            type: 'error',
                            title: 'create task wrong',
                            body: 'wrong',
                            timeout: 3000
                        });
                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'create task wrong',
                        body: 'something wrong',
                        timeout: 3000
                    });
                })
            }

            function confirmAddCaseOrSuite(content) {
                if ($scope.selectType.name == "Test Case") {
                    addCasetoTask(content);
                    addParamsToTask();
                } else {
                    addSuitetoTask(content);
                }
            }

            function runAtask(id) {
                mainFactory.taskAddEnv().put({
                    'taskId': id,
                    'action': 'run',
                    'args': {
                        'task_id': id
                    }
                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        toaster.pop({
                            type: 'success',
                            title: 'run a task success',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                        ngDialog.close();
                        // getProjectDetail();
                    } else {

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            $scope.runAtaskForTable = function runAtaskForTable(id) {
                mainFactory.taskAddEnv().put({
                    'taskId': id,
                    'action': 'run',
                    'args': {
                        'task_id': id
                    }
                }).$promise.then(function(response) {
                    if (response.status == 1) {
                        // toaster.pop({
                        //     type: 'success',
                        //     title: 'run a task success',
                        //     body: 'you can go next step',
                        //     timeout: 3000
                        // });
                        // ngDialog.close();
                        getProjectDetail();
                    } else {
                        toaster.pop({
                            type: 'error',
                            title: 'fail',
                            body: response.result,
                            timeout: 3000
                        });

                    }
                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            function gotoDetail(id) {


                $state.go('app.tasklist', { taskId: id });

            }

            function gotoReport(id) {
                $state.go('app.report', { taskId: id });
            }

            function gotoModify(id) {
                $state.go('app.taskModify', { taskId: id });
            }

            function goBack() {
                window.history.back();
            }

            function goToExternal() {
                window.open(External_URL, '_blank');
            }

            $scope.openDeleteEnv = function openDeleteEnv(id, name) {
                $scope.deleteName = name;
                $scope.deleteId = id;
                ngDialog.open({
                    template: 'views/modal/deleteConfirm.html',
                    scope: $scope,
                    className: 'ngdialog-theme-default',
                    width: 500,
                    showClose: true,
                    closeByDocument: false
                })

            }

            $scope.deleteTask = function deleteTask() {
                mainFactory.deleteTask().delete({ 'task_id': $scope.deleteId }).$promise.then(function(response) {
                    if (response.status == 1) {
                        toaster.pop({
                            type: 'success',
                            title: 'delete Task success',
                            body: 'you can go next step',
                            timeout: 3000
                        });
                        ngDialog.close();
                        getProjectDetail();
                    } else {
                        toaster.pop({
                            type: 'error',
                            title: 'Wrong',
                            body: response.result,
                            timeout: 3000
                        });
                    }

                }, function(error) {
                    toaster.pop({
                        type: 'error',
                        title: 'fail',
                        body: 'unknow error',
                        timeout: 3000
                    });

                })
            }

            $scope.gotoLog = function gotoLog(task_id) {
                $state.go('app.taskLog', { taskId: task_id });
            }
        }
    ]);