define([
  'baranek/app/scripts/controllers/controllers',
  'loader',
  'baranek/app/scripts/controllers/mainController',
  'routing/routing'
], function (controllers, loader) {

  controllers.controller("currertCourseController",
          ['$scope', '$sanitize', 'Course', '$sce', '$q', '$http', '$location', '$timeout', 'BARANEK_PATH',
            function ($scope, $sanitize, Course, $sce, $q, $http, $location, $timeout, BARANEK_PATH) {

              function stepIndexOf(id)
              {
                for (var i = 0; i < $scope.currertCourse.steps.length; i++)
                {
                  if ($scope.currertCourse.steps[i].id === parseInt(id))
                  {
                    return i;
                  }
                }
                ;
                return -1;
              }

              /**
               * Stworzenie szkieletu obiektu currertStep. Jego początkowa inicjalizacja wiąże się z 
               * ustawieniem danych aktualnego 
               */
              $scope.currertStep = {
                id: $scope.user.courses.started[ $scope.user.courses.currert ].step.id,
                structureTemplate: BARANEK_PATH + 'app/views/structures/' + $scope.user.courses.started[ $scope.user.courses.currert ].step.structure + '_structure.html',
                data: {}
              };

              /** 
               * Inicjalizacjja obiektu currertCourse (ustawienie nazwy lekcji, ustawienie id lekcji, 
               * ustawienie najwyższego możliwego kroku, przypisanie pustej tablicy kroków kursu)
               */
              $scope.currertCourse = {
                name: $scope.user.courses.started[ $scope.user.courses.currert ].lessonName,
                id: $scope.user.courses.started[ $scope.user.courses.currert ].id,
                //activeStep: $scope.user.courses.started[ $scope.user.courses.currert ].step.id,
                maxStep: {
                  id: $scope.user.courses.started[ $scope.user.courses.currert ].step.id,
                  orderValue: $scope.user.courses.started[ $scope.user.courses.currert ].step.orderValue
                },
                steps: {}
              };

              /**
               * Pobranie listy kroków dla danego kursu
               */
              if ($scope.user.courses.started[ $scope.user.courses.currert ].id !== null)
              {
                loader.turnOn();
                Course.getStepList(parseInt($scope.user.courses.started[ $scope.user.courses.currert ].id))
                        .then(function (response)
                        {
                          $scope.currertCourse.steps = response.data;

                          var start_index = stepIndexOf($scope.currertStep.id);
                          if (start_index > -1)
                          {
                            $scope.currertStep.data = $scope.currertCourse.steps[start_index];
                          }
                          loader.turnOff();  
                        });
              }

              // Funkcja porównująca dla szablonów. W szablonach nie można parsować.
              $scope.compare = function (value)
              {
                return (parseInt($scope.currertCourse.maxStep.orderValue) < parseInt(value));
              };

              /**
               * Przejście do kolejnego kroku kursu.
               
               * @returns {undefined}
               */
              $scope.nextStep = function ()
              {
                if ($scope.currertStep.id && $scope.currertStep.id === $scope.currertCourse.maxStep.id)
                {
                  loader.turnOn();
                  $scope.userMethods.setProgress($scope.currertCourse.maxStep.id, $scope.answers).then(function (data) {

                    if (data.status === true && data.wasLast === false)
                    {
                      var index = data.nextStepIndex;

                      $scope.currertCourse.maxStep.id = $scope.currertCourse.steps[ index ].id;
                      $scope.currertStep.id = $scope.currertCourse.steps[ index ].id;
                      $scope.currertCourse.maxStep.orderValue = $scope.currertCourse.steps[ index ].orderValue;
                      $scope.currertStep.data = $scope.currertCourse.steps[ index ];
                      $scope.currertStep.structureTemplate = BARANEK_PATH + 'app/views/structures/' + $scope.currertCourse.steps[ index ].structure + '_structure.html';

                      $scope.answers = {};
                      $scope.user.courses.started[$scope.user.courses.currert].step.id = $scope.currertCourse.steps[ index ].id;
                      $scope.user.courses.started[$scope.user.courses.currert].step.structure = $scope.currertCourse.steps[ index ].structure;
                      $scope.user.courses.started[$scope.user.courses.currert].step.orderValue = $scope.currertCourse.steps[ index ].orderValue;
                      $scope.user.courses.started[$scope.user.courses.currert].passed++;
                    }
                    else if (data.status === true && data.wasLast === true)
                    {
                      // Reset aktualnego kursu 
                      $scope.currertCourse = {
                        name: null,
                        currertLesson: null,
                        maxStep: {},
                        steps: {}
                      };

                      $scope.message.title = "Gratulacje!";
                      $scope.message.content = "<span class='finish_adds black_mark'>Kurs został zaliczony!</span>";

                      if (data.adds.title !== false)
                      {
                        $scope.message.content += "<br><span class='finish_adds black_mark'>Odblokowano nowy tytuł: "
                                + "<span class='new blue_mark'>"
                                + data.adds.title.name
                                + "</span>"
                                + "</span>";
                      }

                      if (data.adds.achievement !== false)
                      {
                        $scope.message.content += "<br><span class='finish_adds black_mark'>Nowe osiągnięcie: "
                                + "<span class='new blue_mark'>"
                                + data.adds.achievement.name
                                + "</span>"
                                + "</span>";
                      }

                      $scope.message.content += "<br><span class='finish_adds black_mark'>Zdobyte punkty: "
                              + "<span class='new blue_mark'>"
                              + data.adds.points
                              + "</span>"
                              + "</span>";
                      $scope.message.show = true;

                      $scope.$watch('message.show', function (newValue, oldValue)
                      {
                        if (!newValue)
                        {
                          $scope.$watch('message.show', function ()
                          {
                            $scope.modelActions.init();
                            $location.path("/Baranek/moje-kursy");
                          });
                        }
                      });
                    }
                    else
                    {
                      $scope.message = {
                        content: "Nie wszystkie odpowiedzi są poprawne. Sprawdź jeszcze raz!",
                        title: "Znalazłem błąd!",
                        show: true
                      };
                    }

                    loader.turnOff();
                  });
                }
                else
                {
                  var index = stepIndexOf($scope.currertStep.id);

                  $scope.currertStep.id = $scope.currertCourse.steps[index + 1].id;
                  $scope.currertStep.structureTemplate = BARANEK_PATH + 'app/views/structures/' + $scope.currertCourse.steps[ index + 1 ].structure + '_structure.html';
                  $scope.currertStep.data = $scope.currertCourse.steps[index + 1];
                }
              };


              $scope.changeStep = function (step)
              {
                if (angular.isObject(step) && parseInt(step.orderValue) <= parseInt($scope.currertCourse.maxStep.orderValue))
                {
                  $scope.currertStep.id = step.id;
                  $scope.currertStep.structureTemplate = BARANEK_PATH + 'app/views/structures/' + step.structure + '_structure.html',
                          $scope.currertStep.data = step;
                }
                else if (parseInt(step) === -1)
                {
                  $scope.currertStep.id = -1;
                  $scope.currertStep.structureTemplate = BARANEK_PATH + 'app/views/structures/start_structure.html',
                          $scope.currertStep.data = {};
                }

                $timeout(function () {
                  $scope.mathJaxReload();
                });
              };

              // Funkcja inicjalizująca MathJaxa po includowaniu szablonu
              $scope.mathJaxReload = function ()
              {
                MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
              };

              // Funkcja zwracająca bezpieczny adres URL dla iframe w strukturze CAMERA
              $scope.trustSrc = function (src) {
                return $sce.trustAsResourceUrl(src);
              };

              // Obiekt komunikatu
              $scope.message = {
                content: "",
                show: false
              };

              // Zmiana kroku. Zmiana statusu aktywnego kroku (dla zmiany wyglądu zakładki na żółty) oraz zmiana
              $scope.answers = {};

            }]);
});


/*
 * currertStep - aktualny krok. ID, struktura + dane
 *  ID - potrzebne do przechowywania info o tym, czy dany krok jest najdalszym możliwym i służy określaniu stylu CSS w szalbonie
 *  STRUKTURA - typ potrzebny do wczytania szablonu
 *  DANE - dla odpowiednich szablonów struktur bedą wykorzystywane
 * 
 */