<?php

class CheckcallsController extends BaseController {

	/**
	 * Constructor
	 */
	public function __construct() {
		// Establish Filters
		$this->beforeFilter('auth');

		if (Auth::check()) {
			$this->user	 = Auth::user();
			$this->projects = $this->user->projects()->whereUsecheckcalls(1)->get();
		}
		parent::__construct();

		$this->beforeFilter('hasRole:' . Role::ROLE_CALL_CHECKER);
	}

	public function setupProjects() {
		$this->projects = Project::whereUsecheckcalls(1)->get();
	}

	public function index() {
		foreach ($this->projects as $project) {
			$this->addCalls($project);
//			$this->addCalls($project, "DATE(`mlsitcalls`.created_at)=DATE(DATE_SUB(NOW(), INTERVAL 1 DAY))");
//			if (date('w') == 1) {
//				$this->addCalls($project, "DATE(`mlsitcalls`.created_at)=DATE(DATE_SUB(NOW(), INTERVAL 2 DAY))");
//			}
		}

		return $this->setupLayout('checkcalls.index');
	}

	function addCalls($project, $dateRaw = null) {
		$callsMinQuant = 5;
		if (!$dateRaw) {
			$dateRaw			 = "DATE(`mlsitcalls`.created_at)=DATE(NOW())";
			$callsMinQuant = 10;
		}

		foreach (Mlsitcall::whereRaw($dateRaw)
						->join('partners', function($join) {
							$join->on('partners.id', '=', 'mlsitcalls.partner_id');
						})
						->where('partners.project_id', '=', $project->id)
						->whereNull('call_state')->get(array('mlsitcalls.*')) as $mlsitcall) {
			$mlsitcall->checkStatus();
		}
		foreach (Mlsitcall::whereRaw($dateRaw)
						->join('partners', function($join) {
							$join->on('partners.id', '=', 'mlsitcalls.partner_id');
						})
						->where('partners.project_id', '=', $project->id)
						->whereCallState(0)->get(array('mlsitcalls.*')) as $mlsitcall) {
			$mlsitcall->checkStatus();
		}

		foreach (User::where('users.checkcalls', '=', 1)
						->whereRaw('users.id IN (SELECT users_projects.user_id FROM users_projects WHERE users_projects.project_id=' . $project->id . ')')
						->get() as $user) {

			$projectCallsQuant = Mlsitcall::whereRaw($dateRaw)
							->join('partners', function($join) {
								$join->on('partners.id', '=', 'mlsitcalls.partner_id');
							})
							->where('partners.project_id', '=', $project->id)
							->where('partners.user_id', '=', $user->id)
							->where('mlsitcalls.call_state', '=', 1)
							->where('mlsitcalls.call_duration', '>', 60)
							->count();

			if ($projectCallsQuant > $callsMinQuant && Checkquestion::whereProjectId($project->id)->count()) {
				$checkcallsQuant = Checkcall::join('mlsitcalls', function($join) {
									$join->on('mlsitcalls.id', '=', 'checkcalls.mlsitcall_id');
								})
								->where('checkcalls.user_id', '=', $user->id)
								->whereRaw($dateRaw)
								->count();
				$limit = 5 - $checkcallsQuant;

				if ($limit > 0) {
					$mlsitcalls = Mlsitcall::with('user')
									->whereRaw($dateRaw)
									->join('partners', function($join) {
										$join->on('partners.id', '=', 'mlsitcalls.partner_id');
									})
									->where('mlsitcalls.user_id', '=', $user->id)
									->where('partners.project_id', '=', $project->id)
									->where('mlsitcalls.call_state', '=', 1)
									->where('mlsitcalls.call_duration', '>', 60)
									->whereRaw('`mlsitcalls`.id NOT IN (SELECT mlsitcall_id FROM checkcalls WHERE DATE(created_at)=DATE(NOW()))')
									->orderByRaw('RAND()')
									->take($limit)
									->get(array(DB::raw('mlsitcalls.*')));
					foreach ($mlsitcalls as $mlsitcall) {
						$checkcall = Checkcall::create(array());
						$checkcall->user()->associate($mlsitcall->user);
						$checkcall->mlsitcall()->associate($mlsitcall);
						$checkcall->project()->associate($project);
						$checkcall->checkerUser()->associate($this->user);
						$checkcall->save();
					}
				}
			}
		}
	}

	function update($checkcallId) {
		$checkcall = Checkcall::find($checkcallId);
		if (!$checkcall) {
			return \App::abort(404);
		}
		$input = Input::all();

		if (isset($input['checkquestions'])) {
			$checkcall->checkquestions()->sync(array_keys($input['checkquestions']));
		}
		$checkcall->rating = 100 * ($checkcall->checkquestions->count() / $checkcall->project->checkquestions->count());
		if ($checkcall->rating == 100) {
			$checkcall->status = Checkcall::STATUS_SUCCESS;
		}
		else {
			$checkcall->status = Checkcall::STATUS_FAIL;
		}
		$checkcall->save();

		$response = array(
				'status' => 'success'
		);
		return Response::json($response);
	}

	function delete($checkcallId) {
		$checkcall = Checkcall::find($checkcallId);
		if (!$checkcall) {
			return \App::abort(404);
		}
		$checkcall->delete();

		$response = array(
				'status' => 'success'
		);
		return Response::json($response);
	}

	public function admin() {
		$input = Input::all();

		return $this->setupLayout('checkcalls.admin')->with('input', $input);
	}

}
