/// <reference path="../../includes.ts" />

module app {


    import IUser = services.IUser;
    import SportsWorkoutCombined = services.SportsWorkoutCombined;
    import SportsWorkoutExercise = services.SportsWorkoutExercise;

    class Controller {

        static $inject = [
            '$scope',
            '$sce',
            'sportsService',
            'user'
        ];

        public details: any;
        public selected: any;
        public loaded: boolean = false;

        public days: string[] = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
        public dayIndex: number = -1;
        public diary: any;
        public day: SportsWorkoutCombined;
        public dayDescription: string;
        public sessionTabs: any[];
        public exerciseTabs: any[];
        public exerciseTabValue: string = 'exercises';
        public sessionTabValue: number = 0;
        public session: SportsWorkoutExercise[];
        public exercise: SportsWorkoutExercise;
        public warmup: SportsWorkoutCombined;
        public cooldown: SportsWorkoutCombined;
        public video: string;
        public navigation: any[] = this.sportsService.navigation();

        constructor(
            private $scope: angular.IScope,
            private $sce: angular.ISCEService,
            private sportsService: services.ISportsService,
            public user: IUser
        ) {
            $scope.$on('sportsMetricsChanged', (ev: any, details: any) => {
                this.details = details;
                this.diary = this.sportsService.diaryForCurrentMetrics();
                this.draw();
            });

            $scope.$on('selectDay', (ev: any, index: number) => {
                this.dayIndex = index;
                this.diary = this.sportsService.diaryForCurrentMetrics();
                this.draw();
            });

            $scope.$on('changeSessionEvent', (ev: any, tab: any) => {
                this.sessionTabValue = tab.value;
                this.draw();
            });

            $scope.$on('changeExerciseEvent', (ev: any, tab: any) => {
                this.exerciseTabValue = tab.value;
            });

            sportsService.details().then((value: any) => {
                this.details = value;
                this.warmup = this.sportsService.warmupForCurrentMetrics();
                this.cooldown = this.sportsService.cooldownForCurrentMetrics();
                this.navigation = this.sportsService.navigation();
                this.loaded = true;
            });
        }

        draw() {
            this.diary = this.diary || this.sportsService.diaryForCurrentMetrics();
            this.day = this.diary[this.dayIndex];
            this.sessionTabs = [];
            if (this.day.sessions) {
                this.day.sessions.forEach((s: SportsWorkoutExercise[], index: number) => {
                    this.sessionTabs.push({value: index, label: 'Session ' + (index+ 1)});
                });
            }
            if (['rest', 'recovery'].indexOf(this.day.key) === -1) {
                this.exerciseTabs = [
                    { value: 'warmup', label: 'Warm Up'},
                    { value: 'exercises', label: 'Exercises'},
                    { value: 'cooldown', label: 'Cool Down'}
                ];
            } else {
                this.exerciseTabs = [
                    { value: 'exercises', label: 'Exercises'}
                ];
            }
            this.exerciseTabValue = 'exercises';

            if (this.sessionTabValue >= this.day.sessions.length) {
                this.sessionTabValue = 0;
            }
            this.session = this.day.sessions[this.sessionTabValue];
            if (this.day.description) {
                this.dayDescription = this.$sce.trustAsHtml(
                    this.day.description
                        .replace(/\{\{reps\}\}/g, this.day.reps ? this.day.reps.toString(10) : '')
                        .replace('{{sets}}', this.day.sets ? this.day.sets.toString(10) : '')
                        .replace('{{difficulty}}', this.day.difficulty ? this.day.difficulty.toString(10) : '')
                        .replace('{{rest}}', this.day.rest ? this.day.rest.toString(10) : '')
                        .replace('{{totalrest}}', this.day.totalrest ? this.day.totalrest.toString(10) : '')
                        .replace('{{totalreps}}', this.day.totalreps ? this.day.totalreps.toString(10) : '')
                );
            } else {
                this.dayDescription = '';
            }

        }

        exerciseImage(loc: string) {
            if (loc) {
                if (loc.indexOf('.') > -1) {
                    return 'url(' + loc + ')'
                } else {
                    return 'url(https://i.vimeocdn.com/video/' + loc + '_640.jpg)'
                }
            }
            return '';
        }


        viewVideo(exercise: SportsWorkoutExercise) {
            if (exercise.video.length) {
                this.video = this.$sce.trustAsResourceUrl('https://player.vimeo.com/video/' + exercise.video + '?autoplay=1&loop=1');
                this.exercise = exercise;
            }
        }

        closeVideo() {
            this.exercise = null;
        }
    }

    angular
        .module('app')
        .controller('sportsTrainingCtrl', Controller);
}