<?php

class UtmController extends BaseController {

	/**
	 * Constructor
	 */
	public function __construct() {
		// Establish Filters
		$this->beforeFilter('auth');
		$this->beforeFilter('hasRole:' . Role::ROLE_CRM_STAT);

		if (Auth::check()) {
			$this->user			 = Auth::user();
			$this->projects	 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->get();
		}
		$this->projectPrefix = 'stat';
		parent::__construct();
	}

	public function utmSources() {
		$input = Input::except('page');

		if (Input::has('startDate')) {
			Session::put('stat_startDate', $input['startDate']);
		}
		else {
			$input['startDate'] = Session::get('stat_startDate');
			if (!$input['startDate']) {
				$input['startDate'] = date("d.m.Y");
			}
		}
		if (Input::has('endDate')) {
			Session::put('stat_endDate', $input['endDate']);
		}
		else {
			$input['endDate'] = Session::get('stat_endDate');
			if (!$input['endDate']) {
				$input['endDate'] = date('d.m.Y');
			}
		}

		$startDate = explode('.', $input['startDate']);
		if (checkdate($startDate[1], $startDate[0], $startDate[2])) {
			$startDate = "{$startDate[2]}-{$startDate[1]}-{$startDate[0]}";
		}
		$endDate = explode('.', $input['endDate']);
		if (checkdate($endDate[1], $endDate[0], $endDate[2])) {
			$endDate = "{$endDate[2]}-{$endDate[1]}-{$endDate[0]}";
		}
		$dateWhere = DB::raw("DATE(`partners`.updated_at)>=DATE('{$startDate}') AND DATE(`partners`.updated_at)<=DATE('{$endDate}')");

		if (!Input::has('projectId')) {
			$input['projectId'] = Session::get($this->projectPrefix . '_work_projectId');
		}
		$project = false;
		if (!$input['projectId']) {
			$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->first();
			$input['projectId']	 = $project->id;
		}
		if (!$project) {
			$project = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);
		if (!$project) {
			return \App::abort(404);
		}

		if (!Input::has('siteId')) {
			$input['siteId'] = Session::get('stat_' . $input['projectId'] . '_siteId');
		}
		$site = false;
		if (!$input['siteId']) {
			$site = $project->sites()->first();
			if ($site) {
				$input['siteId'] = $site->id;
			}
		}
		if (!$site) {
			$site = $project->sites()->whereId($input['siteId'])->first();
		}
		Session::put('stat_' . $input['projectId'] . '_siteId', $input['siteId']);

		return $this->setupLayout('stat.utm.utm_sources')
										->with('dateWhere', $dateWhere)
										->with('project', $project)
										->with('utmSources', $project->visitUtmSources)
										->with('input', $input);
	}

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

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		if (isset($input['projectId']) && $input['projectId']) {
			$project = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		}
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$visitUtmSource = VisitUtmSource::create(array(
								'name'	 => trim($input['utmSourceNewName']),
								'params' => trim($input['utmSourceNewParams'])
		));

		$visitUtmSource->user()->associate($this->user);
		$visitUtmSource->project()->associate($project);
		$visitUtmSource->save();

		$response = array(
				'status'		 => 'success',
				'id'				 => $visitUtmSource->id,
				'utmSource'	 => View::make('stat.utm.utm_source')->with('visitUtmSource', $visitUtmSource)->render(),
		);
		return Response::json($response);
	}

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

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);

		if (!isset($input['pk']) || !isset($input['name'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$visitUtmSource = VisitUtmSource::find($input['pk']);
		if ($visitUtmSource == null || !is_numeric($input['pk'])) {
			$response = array('status' => 'fail', 'message' => 'Канал не найден');
			return Response::json($response);
		}

		$visitUtmSource->$input['name'] = trim($input['value']);
		$visitUtmSource->save();

		$response = array(
				'status'		 => 'success',
				'id'				 => $visitUtmSource->id,
				'name'			 => $input['name'],
				'utmSource'	 => View::make('stat.utm.utm_source')->with('visitUtmSource', $visitUtmSource)->render(),
		);
		return Response::json($response);
	}

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

		if (!isset($input['id'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);

		$visitUtmSource = VisitUtmSource::find($input['id']);
		if ($visitUtmSource == null || !is_numeric($input['id'])) {
			$response = array('status' => 'fail', 'message' => 'Канал не найден');
			return Response::json($response);
		}

		$visitUtmSource->delete();

		$response = array(
				'status'		 => 'success',
				'id'				 => $visitUtmSource->id,
				'utmSource'	 => View::make('stat.utm.utm_source')->with('visitUtmSource', $visitUtmSource)->render(),
		);
		return Response::json($response);
	}

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

		if (!isset($input['id'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);

		$visitUtmSource = VisitUtmSource::withTrashed()->find($input['id']);
		if ($visitUtmSource == null || !is_numeric($input['id'])) {
			$response = array('status' => 'fail', 'message' => 'Канал не найден');
			return Response::json($response);
		}

		$visitUtmSource->restore();

		$response = array(
				'status'		 => 'success',
				'id'				 => $visitUtmSource->id,
				'utmSource'	 => View::make('stat.utm.utm_source')->with('visitUtmSource', $visitUtmSource)->render(),
		);
		return Response::json($response);
	}

	public function utmCampaigns() {
		$input = Input::except('page');

		if (Input::has('startDate')) {
			Session::put('stat_startDate', $input['startDate']);
		}
		else {
			$input['startDate'] = Session::get('stat_startDate');
			if (!$input['startDate']) {
				$input['startDate'] = date("d.m.Y");
			}
		}
		if (Input::has('endDate')) {
			Session::put('stat_endDate', $input['endDate']);
		}
		else {
			$input['endDate'] = Session::get('stat_endDate');
			if (!$input['endDate']) {
				$input['endDate'] = date('d.m.Y');
			}
		}

		$startDate = explode('.', $input['startDate']);
		if (checkdate($startDate[1], $startDate[0], $startDate[2])) {
			$startDate = "{$startDate[2]}-{$startDate[1]}-{$startDate[0]}";
		}
		$endDate = explode('.', $input['endDate']);
		if (checkdate($endDate[1], $endDate[0], $endDate[2])) {
			$endDate = "{$endDate[2]}-{$endDate[1]}-{$endDate[0]}";
		}
		$dateWhere = DB::raw("DATE(`partners`.updated_at)>=DATE('{$startDate}') AND DATE(`partners`.updated_at)<=DATE('{$endDate}')");

		if (!Input::has('projectId')) {
			$input['projectId'] = Session::get($this->projectPrefix . '_work_projectId');
		}
		$project = false;
		if (!$input['projectId']) {
			$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->first();
			$input['projectId']	 = $project->id;
		}
		if (!$project) {
			$project = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);
		if (!$project) {
			return \App::abort(404);
		}

		if (!Input::has('siteId')) {
			$input['siteId'] = Session::get('stat_' . $input['projectId'] . '_siteId');
		}
		$site = false;
		if (!$input['siteId']) {
			$site = $project->sites()->first();
			if ($site) {
				$input['siteId'] = $site->id;
			}
		}
		if (!$site) {
			$site = $project->sites()->whereId($input['siteId'])->first();
		}
		Session::put('stat_' . $input['projectId'] . '_siteId', $input['siteId']);

		$utmSources = array();
		foreach ($project->visitUtmSources as $visitUtmSource) {
			$utmSources[$visitUtmSource->id] = $visitUtmSource->name;
		}

		return $this->setupLayout('stat.utm.utm_campaigns')
										->with('dateWhere', $dateWhere)
										->with('project', $project)
										->with('utmSources', $utmSources)
										->with('utmCampaigns', $project->visitUtmCampaigns)
										->with('input', $input);
	}

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

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		if (isset($input['projectId']) && $input['projectId']) {
			$project = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		}
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$visitUtmCampaign = VisitUtmCampaign::create(array(
								'name'								 => trim($input['utmCampaignNewName']),
								'params'							 => trim($input['utmCampaignNewParams']),
								'visit_utm_source_id'	 => $input['utmCampaignNewUtmSource']
		));

		$visitUtmCampaign->user()->associate($this->user);
		$visitUtmCampaign->project()->associate($project);
		$visitUtmCampaign->save();

		$response = array(
				'status'			 => 'success',
				'id'					 => $visitUtmCampaign->id,
				'utmCampaign'	 => View::make('stat.utm.utm_campaign')->with('visitUtmCampaign', $visitUtmCampaign)->render(),
		);
		return Response::json($response);
	}

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

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);

		if (!isset($input['pk']) || !isset($input['name'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		if (!isset($input['name']) || ($input['name'] == 'visit_utm_source_id' && !$input['value'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$visitUtmCampaign = VisitUtmCampaign::find($input['pk']);
		if ($visitUtmCampaign == null || !is_numeric($input['pk'])) {
			$response = array('status' => 'fail', 'message' => 'Канал не найден');
			return Response::json($response);
		}

		$visitUtmCampaign->$input['name'] = trim($input['value']);
		$visitUtmCampaign->save();

		$response = array(
				'status'			 => 'success',
				'id'					 => $visitUtmCampaign->id,
				'name'				 => $input['name'],
				'utmCampaign'	 => View::make('stat.utm.utm_campaign')->with('visitUtmCampaign', $visitUtmCampaign)->render(),
		);
		return Response::json($response);
	}

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

		if (!isset($input['id'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);

		$visitUtmCampaign = VisitUtmCampaign::find($input['id']);
		if ($visitUtmCampaign == null || !is_numeric($input['id'])) {
			$response = array('status' => 'fail', 'message' => 'Канал не найден');
			return Response::json($response);
		}

		$visitUtmCampaign->delete();

		$response = array(
				'status'			 => 'success',
				'id'					 => $visitUtmCampaign->id,
				'utmCampaign'	 => View::make('stat.utm.utm_campaign')->with('visitUtmCampaign', $visitUtmCampaign)->render(),
		);
		return Response::json($response);
	}

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

		if (!isset($input['id'])) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}

		$input['projectId']	 = Session::get($this->projectPrefix . '_work_projectId');
		$project						 = false;
		$project						 = $this->user->projects()->whereUsecrm(1)->whereType(Project::TYPE_SHOP)->whereId($input['projectId'])->first();
		if (!$project) {
			$response = array('status' => 'fail');
			return Response::json($response);
		}
		Session::put($this->projectPrefix . '_work_projectId', $input['projectId']);

		$visitUtmCampaign = VisitUtmCampaign::withTrashed()->find($input['id']);
		if ($visitUtmCampaign == null || !is_numeric($input['id'])) {
			$response = array('status' => 'fail', 'message' => 'Канал не найден');
			return Response::json($response);
		}

		$visitUtmCampaign->restore();

		$response = array(
				'status'			 => 'success',
				'id'					 => $visitUtmCampaign->id,
				'utmCampaign'	 => View::make('stat.utm.utm_campaign')->with('visitUtmCampaign', $visitUtmCampaign)->render(),
		);
		return Response::json($response);
	}

}
