<?php

namespace backend\controllers;

use Yii;
use common\models\Contract;
use backend\models\ContractSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use backend\models\ContractCustomerSearch;
use common\models\Customer;
use yii\db\Query;
use backend\models\ContractRequestSearch;
use common\models\TicketInstallmentRequest;
use common\models\Ticket;
use common\models\Transfer;
use yii\base\Exception;
use common\components\RoleDefinition;

/**
 * ContractController implements the CRUD actions for Contract model.
 *
 * TODO: FIX CONTROLLER
 */
class ContractController extends Controller {
	public function behaviors() {
		return [ 
				'access' => [ 
						'class' => \yii\filters\AccessControl::className (),
						'rules' => [
								// allow authenticated users
								[ 
										'actions' => [ ],
										'allow' => true,
										'roles' => [ 
												'admin',
												'employee',
												'reception' 
										] 
								] 
						]
						// everything else is denied
						 
				] 
		];
	}
	
	/**
	 * Lists all Contract models.
	 * 
	 * @return mixed
	 */
	public function actionIndex() {
		$searchModel = new ContractSearch ();
		$dataProvider = $searchModel->search ( Yii::$app->request->queryParams );
		
		return $this->render ( 'index', [ 
				'searchModel' => $searchModel,
				'dataProvider' => $dataProvider 
		] );
	}
	/**
	 * Lists all Contract models.
	 * 
	 * @return mixed
	 */
	public function actionIndexCustomer($id) {
		$model = Customer::findOne ( $id );
		
		if (! isset ( $model )) {
			throw new NotFoundHttpException ( 'The requested page does not exist.' );
		}
		
		$searchModel = new ContractCustomerSearch ( [ 
				'customer' => $model 
		] );
		$dataProvider = $searchModel->search ( Yii::$app->request->queryParams );
		
		return $this->render ( 'index-customer', [ 
				'searchModel' => $searchModel,
				'dataProvider' => $dataProvider 
		] );
	}
	
	/**
	 * Displays a single Contract model.
	 * 
	 * @param integer $id        	
	 * @return mixed
	 */
	public function actionView($id) {
		return $this->render ( 'view', [ 
				'model' => $this->findModel ( $id ) 
		] );
	}
	
	/**
	 * Creates a new Contract model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 * 
	 * @return mixed
	 */
	public function actionCreate() {
		$model = new Contract ();
		
		if ($model->load ( Yii::$app->request->post () ) && $model->save ()) {
			return $this->redirect ( [ 
					'view',
					'id' => $model->id_contract 
			] );
		} else {
			return $this->render ( 'create', [ 
					'model' => $model 
			] );
		}
	}
	
	/**
	 * Updates an existing Contract model.
	 * If update is successful, the browser will be redirected to the 'view' page.
	 * 
	 * @param integer $id        	
	 * @return mixed
	 */
	public function actionUpdate($id) {
		$model = $this->findModel ( $id );
		
		if ($model->load ( Yii::$app->request->post () ) && $model->save ()) {
			return $this->redirect ( [ 
					'view',
					'id' => $model->id_contract 
			] );
		} else {
			return $this->render ( 'update', [ 
					'model' => $model 
			] );
		}
	}
	
	/**
	 * Deletes an existing Contract model.
	 * If deletion is successful, the browser will be redirected to the 'index' page.
	 * 
	 * @param integer $id        	
	 * @return mixed
	 */
	public function actionDelete($id) {
		$model = $this->findModel ( $id );
		
		if ( !RoleDefinition::isAdmin() ){
			throw new Exception ( "A szerződés nem törölhető" );
		}
		
		if ($model->flag != Contract::$FLAG_ACTIVE) {
			throw new Exception ( "A szerződés nem törölhető" );
		}
		
		$parts = TicketInstallmentRequest::find ()->andWhere ( [ 
				'not in',
				'status',
				[ 
						TicketInstallmentRequest::$STATUS_CANCELED,
						TicketInstallmentRequest::$STATUS_PENDING 
				] 
		] )->all ();
		
		if (count ( $parts ) > 0) {
			throw new Exception ( "Már van feldolgozott részlet, nem lehet törölni" );
		}
		
		$tx = \Yii::$app->db->beginTransaction ();
		
		try {
			
			Contract::updateAll ( [ 
					'flag' => Contract::$FLAG_DELETED 
			], [ 
					'id_contract' => $model->id_contract 
			] );
			
			TicketInstallmentRequest::updateAll ( [ 
					'status' => TicketInstallmentRequest::$STATUS_CANCELED 
			], [ 
					'id_contract' => $model->id_contract 
			] );
			$ticket = Ticket::find ()->andWhere ( [ 
					'id_contract' => $model->id_contract 
			] )->one ();
			
			$transfer = Transfer::find ()->andWhere ( [ 
					'type' => Transfer::TYPE_TICKET 
			] )->andWhere ( [ 
					'id_object' => $ticket->id_ticket 
			] )->one ();
			
			$transfer->storno ();
			
			$tx->commit ();
			// $tx->rollBack();
		} catch ( \Exception $e ) {
			$tx->rollBack ();
			echo $e->getMessage ();
			throw $e;
		}
		
		return $this->redirect ( [ 
				'index' 
		] );
	}
	public function actionDetails($id) {
		$contract = Contract::findOne ( $id );
		// ticket_installment_request
		
		if (! isset ( $contract )) {
			throw new NotFoundHttpException ( 'The requested page does not exist.' );
		}
		
		$searchModel = new ContractRequestSearch ( [ 
				'contract' => $contract 
		] );
		
		// $searchModel->contract = $contract;
		
		$dataProvider = $searchModel->search ( Yii::$app->request->queryParams );
		
		return $this->render ( 'details', [ 
				'model' => $contract,
				'searchModel' => $searchModel,
				'dataProvider' => $dataProvider 
		] );
	}
	
	/**
	 * Finds the Contract model based on its primary key value.
	 * If the model is not found, a 404 HTTP exception will be thrown.
	 * 
	 * @param integer $id        	
	 * @return Contract the loaded model
	 * @throws NotFoundHttpException if the model cannot be found
	 */
	protected function findModel($id) {
		if (($model = Contract::findOne ( $id )) !== null) {
			return $model;
		} else {
			throw new NotFoundHttpException ( 'The requested page does not exist.' );
		}
	}
}
