<?php

class UsertasksController extends BaseController {

	protected $rules		 = array(
			'name' => 'required|max:50',
	);
	protected $messages	 = array(
			'required' => 'Неообходимо ввести название'
	);

	/**
	 * Constructor
	 */
	public function __construct() {
		// Establish Filters
		$this->beforeFilter('auth');
		$this->beforeFilter('csrf', array('only' => array('updateTask')));
		$this->beforeFilter('inGroup:Admins', array('except' => array('myTasks', 'updateTask')));

		parent::__construct();
	}

	/**
	 * Display a listing of the resource.
	 *
	 * @return Response
	 */
	public function index() {
		$usertasks = Usertask::orderBy('name', 'ASC')->get();

		return View::make('usertasks.index')->with('usertasks', $usertasks);
	}

	/**
	 * Show the form for creating a new resource.
	 *
	 * @return Response
	 */
	public function create() {
		return View::make('usertasks.create')->with('users', User::wherePerformsusertasks(1)->get());
	}

	/**
	 * Store a newly created resource in storage.
	 *
	 * @return Response
	 */
	public function store() {
		$input			 = Input::all();
		$validation	 = Validator::make($input, $this->rules, $this->messages);

		if ($validation->fails()) {
			return Redirect::action('UsertasksController@create')
											->withInput()
											->withErrors($validation->errors());
		}
		else {
			$input		 = Input::all();
			$usertask	 = Usertask::create(array(
									'name' => e($input['name']),
									'fine' => e($input['fine']),
			));

			if (isset($input['users'])) {
				$usertask->users()->sync(array_keys($input['users']));
			}

			return Redirect::to('/usertasks');
		}
	}

	/**
	 * Show the form for editing the specified resource.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function edit($id) {
		$usertask = Usertask::find($id);
		if ($usertask == null || !is_numeric($id)) {
			return \App::abort(404);
		}

		$currentUsers	 = $usertask->users->toArray();
		$usertaskUsers = array();
		foreach ($currentUsers as $user) {
			array_push($usertaskUsers, $user['id']);
		}

		return View::make('usertasks.edit')
										->with('users', User::wherePerformsusertasks(1)->get())
										->with('usertask', $usertask)
										->with('usertaskUsers', $usertaskUsers);
	}

	/**
	 * Update the specified resource in storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function update($id) {
		$input			 = Input::all();
		$validation	 = Validator::make($input, $this->rules, $this->messages);

		if ($validation->fails()) {
			return Redirect::action('UsertasksController@edit', $id)
											->withInput()
											->withErrors($validation->errors());
		}
		else {
			$usertask = Usertask::find($id);
			if ($usertask == null || !is_numeric($id)) {
				return \App::abort(404);
			}

			$usertask->name	 = e($input['name']);
			$usertask->fine	 = e($input['fine']);
			$usertask->save();

			if (isset($input['users'])) {
				$usertask->users()->sync(array_keys($input['users']));
			}
			else {
				$usertask->users()->detach();
			}

			return Redirect::to('/usertasks');
		}
	}

	/**
	 * Remove the specified resource from storage.
	 *
	 * @param  int  $id
	 * @return Response
	 */
	public function destroy($id) {
		$usertask = Usertask::find($id);
		if ($usertask == null || !is_numeric($id)) {
			return \App::abort(404);
		}
		Usertask::destroy($id);

		return Redirect::to('/usertasks');
	}

	public function myTasks() {
		$usertasks = Usertask::join('usertasks_users', function($join) {
							$join->on('usertasks_users.usertask_id', '=', 'usertasks.id');
						})
						->where('usertasks_users.user_id', '=', Auth::user()->id)
						->whereRaw('usertasks.id NOT IN (SELECT usertask_id FROM usertask_results WHERE DATE(created_at)=DATE(NOW()) AND user_id=?)', array(Auth::user()->id))
						->get();

		if (!$usertasks || !$usertasks->count()) {
			return Redirect::to('/');
		}

		return View::make('usertasks.mytasks')->with('usertasks', $usertasks);
	}

	public function updateTask($usertaskId) {
		$usertask = Usertask::join('usertasks_users', function($join) {
							$join->on('usertasks_users.usertask_id', '=', 'usertasks.id');
						})
						->where('usertasks_users.user_id', '=', Auth::user()->id)
						->whereRaw('usertasks.id NOT IN (SELECT usertask_id FROM usertask_results WHERE DATE(created_at)=DATE(NOW()) AND user_id=?)', array(Auth::user()->id))
						->where('usertasks.id', '=', $usertaskId)
						->first();

		$content = Input::get('content');
		if ($usertask && $content) {
			$user = Auth::user();

			$result = UsertaskResult::create(array(
									'content' => $content
			));
			$result->user()->associate($user);
			$result->usertask()->associate($usertask);
			$result->save();
		}

		return Redirect::to('mytasks');
	}

}
