﻿"use strict";

app.controller("categorySubmissionsController", ["$rootScope", "$scope", "$routeParams", "$q", "$location", "categoryDataService", "categorySubmissionDataService", "submissionDataService", "judgeRulesService", "votingService", "usageDataService",
    function ($rootScope, $scope, $routeParams, $q, $location, categoryDataService, categorySubmissionDataService, submissionDataService, judgeRulesService, votingService, usageDataService) {
        $scope.votingService = votingService;
        $scope.judgeRulesService = judgeRulesService;
        $scope.currentCatId = $routeParams.catId;

        $scope.nomineePreviewImageUrl = "";

        $scope.currentCategory = { id: 0 };
        $scope.categories = [];
        $scope.submissions = [];
        $scope.votes = [];
        $scope.singleColumnCategories = {};
        $scope.ballotId = 0;

        var oneName = ["1", "2", "3", "5", "6", "8", "9", "10", "14"];
        var twoNames = ["4", "7", "15", "16", "32"];
        var threeNames = ["11", "12"];

        $scope.bioLabel = "Bio";

        // Override at show level.
        $scope.showSubmissionRunningTime = false;

        // ----- Event listeners
        $scope.$on("refreshVotesRequired", function (event, data) {
            $scope.getSubmissions($scope.currentCategory.id);
        });
        $scope.$on("swapVote", function (event, data) {
            $scope.votes = votingService.getVotes();
        });
        $scope.$on("submitVote", function (event, data) {
            $scope.currentCatId = $scope.currentCategory.id; // Set the current cat id to the current cat, in case the order of cats changes on us
            $scope.getCategories().then(function (categoryId) {
                $scope.getSubmissions(categoryId);
            });
        });

        $scope.setNomineePreviewImageUrl = function (submission) {
            if (typeof submission.expanded === "undefined") {
                submission.nomineePreviewImageUrl = $rootScope.getImageUrl(submission.nomineeMediaId);
                submissionDataService.getSubmission(submission.submissionId).then(function (results) {
                    submission.submissionData = results.data.submission;
                    submission.expanded = true;
                });
            }
            else {
                submission.expanded = !submission.expanded;
            }
        };

        // ----- Helpers
        $scope.init = function () {
            $scope.getCategories().then(function (categoryId) {
                $scope.getSubmissions(categoryId);
                $scope.ballotId = $scope.currentCategory.ballotId;
            });

            $rootScope.isDetailsView = false;
            if ($scope.firstLogin) {
                $rootScope.showMenuHint = true;
                $rootScope.firstLogin = false;
            }
            else {
                $rootScope.showMenuHint = false;
            }
        };
        $scope.isActive = function (catId) {
            return ($scope.currentCategory.id === catId);
        };
        $scope.getCategories = function () {
            var deferred = $q.defer();
            categoryDataService.getCategories().then(function (results) {
                $scope.categories = results.data;
                if ($scope.categories.length > 0) {
                    if (!$scope.currentCatId) {
                        $scope.currentCategory = $scope.categories[0];
                    }
                    else {
                        $scope.currentCategory = $.grep($scope.categories, function (x) {
                            return (x.id == $scope.currentCatId);
                        })[0];
                    }

                    //set ballot
                    var ballotCategories = $scope.categories.filter(function (e) {
                        return e.ballotId === $scope.currentCategory.ballotId;
                    });

                    var isSubmitted = ballotCategories.filter(function (e) { return e.submitted; }).length > 0;
                    var isComplete = ballotCategories.filter(function (e) { return e.percentCompleted < 100; }).length === 0;
                    var allowPartiallyCompleted = ballotCategories[0].allowPartiallyCompleted === 1;

                    $scope.ballot = {
                        ballotId: ballotCategories[0].ballotId,
                        ballotName: ballotCategories[0].ballotName,
                        isComplete: isComplete,
                        allowPartiallyCompleted: allowPartiallyCompleted,
                        isSubmitted: isSubmitted
                    };

                    $scope.currentCategory.submitted = isSubmitted ? 1 : 0;

                    deferred.resolve($scope.currentCategory.id);
                }
                else {
                    $rootScope.validateRounds(false);
                    deferred.reject();
                }
            },
            function (error) {
                console.error('error on getCategories');
                deferred.reject();
            });

            return deferred.promise;
        };

        $scope.getSubmissions = function (catId) {
            categorySubmissionDataService.getSubmissionsForCategory(catId).then(function (results) {
                for (var i = 0; i < results.data.submissions.length; i++) {
                    results.data.submissions[i].nomineeThirdName = judgeRulesService.getThirdName(results.data.submissions[i].nomineeDetails);
                    results.data.submissions[i].bio = judgeRulesService.getBio(results.data.submissions[i].nomineeDetails);
                    results.data.submissions[i].city = judgeRulesService.getXmlFieldValue(results.data.submissions[i].packageDetails, "City");
                    results.data.submissions[i].state = judgeRulesService.getXmlFieldValue(results.data.submissions[i].packageDetails, "State");
                }
                $scope.submissions = results.data.submissions;
                $scope.voteTypeId = results.data.voteTypeId;
                $scope.voteTypeConfig = results.data.voteTypeConfig;
                $scope.roundId = results.data.roundId;
                $scope.roundSortOrder = results.data.roundSortOrder;

                if ($scope.roundSortOrder > 1) {
                    $scope.singleColumnCategories = {
                        '14': true,
                        '15': true,
                        '25': true,
                        '36': true
                    };
                }
                else {
                    $scope.singleColumnCategories = {
                        '36': true
                    };
                }

                var columns = judgeRulesService.getSubmissionColumns($scope.currentCategory.categoryNumber, $scope.singleColumnCategories[$scope.currentCategory.categoryNumber]);

                if (columns) {
                    for (var prop in columns) {
                        if (columns.hasOwnProperty(prop)) {
                            $scope[prop] = columns[prop];
                        }
                    }
                }

                // Init the voting service and grab the current votes
                votingService.resetCriteriaVotePanel();
                votingService.init($scope.voteTypeId, $scope.voteTypeConfig, $scope.currentCategory).then(function (results) {
                    $scope.votes = votingService.getVotes();
                });
            },
            function (error) {
                console.error('error on getSubmissions');
            });
        };
        $scope.addSubmissionMediaToPlaylist = function (subId) {
            console.i("Adding submission videos to playlist...");
            submissionDataService.getSubmission(subId).then(function (results) {
                $scope.submission = results.data.submission;

                var mediaList = [];
                for (var index = 0; index < $scope.submission.videos.length; index++) {
                    var video = $scope.submission.videos[index];
                    if (video) {
                        var url = $scope.getStreamingLink(video.media.id);
                        console.error('Not implemented');
                    }
                }
                
            });
        };

        $scope.play = function (mediaId, title, artist, submissionId) {
            var url = $scope.getStreamingLink(mediaId);
            console.error('Not implemented');
        };

        // ----- Main code
        $scope.init();


    }]);