package com.infinite.focus.server.activity;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaBuilder.In;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Selection;
import javax.persistence.metamodel.SingularAttribute;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.Query;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.cloudinary.Cloudinary;
import com.cloudinary.utils.ObjectUtils;
import com.infinite.focus.server.activity.Activity;
import com.infinite.focus.server.activity.ActivityRepository;
import com.infinite.focus.server.activity.ActivityTypeRepository;
import com.infinite.focus.server.auth.AccountRepository;
import com.infinite.focus.server.auth.AvatarRepository;
import com.infinite.focus.server.grade.Grade;
import com.infinite.focus.server.grade.GradeRepository;
import com.infinite.focus.server.auth.Instructor;
import com.infinite.focus.server.auth.InstructorRepository;
import com.infinite.focus.server.auth.InstructorSignUpRequest;
import com.infinite.focus.server.auth.Student;
import com.infinite.focus.server.auth.StudentRepository;
import com.infinite.focus.server.dashboard.mooddata.MoodDataService;
import com.infinite.focus.server.dashboard.socioemotionalassessment.SocioEmotionalAssessmentService;
import com.infinite.focus.server.dashboard.stats.StatsService;
import com.infinite.focus.server.dashboard.userstats.UserStatsService;
import com.infinite.focus.server.data.AssessmentDataWrapper;
import com.infinite.focus.server.data.MoodOccurance;
import com.infinite.focus.server.home.DailyAppreciationRepository;
import com.infinite.focus.server.home.MoodUpdate;
import com.infinite.focus.server.home.MoodUpdateRepository;
import com.infinite.focus.server.home.MoodUpdate_;
import com.infinite.focus.server.home.QuoteRepository;
import com.infinite.focus.server.lessons.Lesson;
import com.infinite.focus.server.lessons.LessonRecord;
import com.infinite.focus.server.lessons.LessonRecordRepository;
import com.infinite.focus.server.lessons.LessonRecordWrapper;
import com.infinite.focus.server.lessons.LessonRepository;
import com.infinite.focus.server.standard.Standard;
import com.infinite.focus.server.standard.StandardRepository;
import com.infinite.focus.server.students.Class;
import com.infinite.focus.server.students.ClassRepository;
import com.infinite.focus.server.students.Student_;
import com.infinite.focus.server.tests.AnswerRepository;
import com.infinite.focus.server.tests.CorrectAnswerRepository;
import com.infinite.focus.server.tests.MultipleChoiceOptionRepository;
import com.infinite.focus.server.tests.QuestionRepository;
import com.infinite.focus.server.tests.SocioEmotionalTestAnswer;
import com.infinite.focus.server.tests.SocioEmotionalTestAnswerRepository;
import com.infinite.focus.server.tests.SocioEmotionalTestDataWrapper;
import com.infinite.focus.server.tests.SocioEmotionalTestQuestion;
import com.infinite.focus.server.tests.SocioEmotionalTestQuestionOption;
import com.infinite.focus.server.tests.SocioEmotionalTestQuestionOptionRepository;
import com.infinite.focus.server.tests.SocioEmotionalTestQuestionRepository;
import com.infinite.focus.server.tests.SocioEmotionalTestQuestionTypeRepository;
import com.infinite.focus.server.tests.SocioEmotionalTestResult;
import com.infinite.focus.server.tests.SocioEmotionalTestResultRepository;
import com.infinite.focus.server.tests.SocioEmotionalTestResult_;
import com.infinite.focus.server.tests.Test;
import com.infinite.focus.server.tests.TestRepository;
import com.infinite.focus.server.tests.TestResult;
import com.infinite.focus.server.tests.TestResultGrade;
import com.infinite.focus.server.tests.TestResultGradeRepository;
import com.infinite.focus.server.tests.TestResultRepository;
import com.infinite.focus.server.utils.AppUtils;
import com.infinite.focus.server.utils.DateUtils;
import com.infinite.focus.server.utils.MoodUpdateUtils;
import com.infinite.focus.server.wall.WallPost;
import com.infinite.focus.server.wall.WallPostAttachment;
import com.infinite.focus.server.wall.WallPostAttachmentRepository;
import com.infinite.focus.server.wall.WallPostRepository;
import com.infinite.focus.server.wall.WallPostRequestRepository;
import com.infinite.focus.server.wall.WallPostWrapper;

/**
 * 
 * @author Saboor Created: 11/25/18
 * 
 *
 */

@CrossOrigin(origins = "http://localhost:8383")
@RestController
@RequestMapping("api/activity")

public class ActivityController {

	private StudentRepository studentRepository;
	private InstructorRepository instructorRepository;
	private LessonRepository lessonRepository;	
	private ActivityRepository activityRepository;
	private ActivityTypeRepository activityTypeRepository;

	public ActivityController(
			ActivityRepository activityRepository,
			ActivityTypeRepository activityTypeRepository,
			InstructorRepository instructorRepository, 
			StudentRepository studentRepository,
			LessonRepository lessonRepository) {

		
		this.activityRepository = activityRepository;
		this.activityTypeRepository = activityTypeRepository;
		this.studentRepository = studentRepository;
		this.instructorRepository = instructorRepository;
		this.lessonRepository = lessonRepository;
	}

	@PostMapping("/create")
	public ResponseEntity<Activity> createActivity(@RequestBody Activity request) {
		
		if(request.getStudent_id() != null) {
			Student s = studentRepository.getOne(request.getStudent_id());
			request.setStudent(s);
		}
		
		if(request.getInstructor_id() != null) {
			Instructor i = instructorRepository.getOne(request.getInstructor_id());
			request.setInstructor(i);
		}
		
		if(request.getActivity_type_id() == 2) {
			Lesson lesson = lessonRepository.findByVideoUrl(request.getVideo_url());
			request.setEntity_id(lesson.getLesson_id());
		}
		
		System.out.println("StartDate " + DateUtils.dailyDateFormat.format(request.getStart_date_time()) + " End Date " + DateUtils.dailyDateFormat.format(request.getEnd_date_time()));
		
		return new ResponseEntity<Activity>(activityRepository.save(request), HttpStatus.OK);
	}
	
	@GetMapping("/set-video-duration-in-activity-in-seconds")
	public ResponseEntity<List<Activity>> setVideoDurationInActivityInSe() {
		
		List<Activity> activities = activityRepository.getAllVideoActivities();
		
		for(Activity activity: activities) {
			
			if(activity.getWatch_duration() == 0) {
				
				long diffInActivity = activityRepository.getDifferenceBetweenStartDateTimeAndEndDateTimeInSecondsByActivityId(activity.getActivity_id());
				
				activity.setWatch_duration(diffInActivity);		
				activityRepository.save(activity);
			}
		}
		
		return new ResponseEntity<List<Activity>>(activities, HttpStatus.OK);
	}
}
