<?php

namespace backend\controllers;

use Yii;
use common\models\Ticket;
use backend\models\TicketSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\Discount;
use common\models\TicketType;
use common\models\Account;
use common\models\User;
use common\models\Customer;
use common\models\Card;
use backend\models\TicketSearchStatisitcs;
use backend\models\TicketSearchCustomer;
use common\components\TicketSale;
use common\models\Contract;
use common\components\giro\GiroDETSTATetel;
use common\components\DetStatTetelProcessor;
use yii\helpers\VarDumper;
use backend\models\TicketUpdate;
use yii\helpers\Url;
use frontend\components\HtmlHelper;
use common\components\Helper;

/**
 * TicketController implements the CRUD actions for Ticket model.
 */
class TicketController extends \backend\controllers\BackendController {
	public function behaviors() {
		return [ 
				'access' => [ 
						'class' => \yii\filters\AccessControl::className (),
						'rules' => [
								// allow authenticated users
								[ 
										'actions' => [ 
												'create',
												'index',
												'view',
												'update',
												'index-customer',
												'statistics' ,
												'test'
										],
										'allow' => true,
										'roles' => [ 
												'admin',
												'employee',
												'reception' 
										] 
								] 
						]
						// everything else is denied
						 
				] 
		];
	}
	
	/**
	 * Lists all Ticket models.
	 * 
	 * @return mixed
	 */
	public function actionIndex() {
		$searchModel = new TicketSearch ();
		$dataProvider = $searchModel->search ( Yii::$app->request->queryParams );
		$searchModel->searchTotals ();
		
		$searchModel->users = User::read ();
		$searchModel->accounts = Account::read ();
		$searchModel->ticketTypes = TicketType::read ();
		
		return $this->render ( 'index', [ 
				'searchModel' => $searchModel,
				'dataProvider' => $dataProvider 
		] );
	}
	
	/**
	 * Lists all Ticket models.
	 * 
	 * @return mixed
	 */
	public function actionStatistics() {
		$searchModel = new TicketSearchStatisitcs();
		$searchModel->search ( Yii::$app->request->queryParams );
		$searchModel->searchTotals ();
		
		$searchModel->users = User::read ();
		$searchModel->accounts = Account::read ();
		$searchModel->ticketTypes = TicketType::read ();
		
		if ($searchModel->output == 'pdf') {
			$user = User::findOne ( \Yii::$app->user->id );
			$mpdf = new \mPDF ( 'utf-8', 'A4-L' );
			$fn = "";
			$ov = '_total_content_pdf';
			$dt = "_letrehozva_" . date ( "Ymd_His" ) . "_" . $user->username;
			$interval = "";
			$account = "";
			$currentUser = "";
			$fn = $fn . $interval . $dt . $account . $currentUser . ".pdf";
			
			$mpdf->useSubstitutions = false;
			$mpdf->simpleTables = true;
			$mpdf->SetHeader ( \Yii::$app->params ["company_name"] . " - Létrehozva: " . $user->username . ", " . \Yii::$app->formatter->asDatetime ( time () ) );
			$mpdf->setFooter ( '{PAGENO} / {nb}' );
			
			$stylesheet = file_get_contents ( \Yii::getAlias ( '@vendor' . '/bower/bootstrap/dist/css/bootstrap.css' ) ); // external css
			$mpdf->WriteHTML ( $stylesheet, 1 );
			
			$mpdf->WriteHTML ( $this->renderPartial ( 'statistics_pdf', [ 
					'searchModel' => $searchModel 
			] ) );
			$mpdf->Output ( $fn, 'D' );
			exit ();
		} else {
			
			return $this->render ( 'statistics', [ 
					'searchModel' => $searchModel 
			] );
		}
	}
	
	/**
	 * Lists all Ticket models.
	 * 
	 * @return mixed
	 */
	public function actionIndexCustomer($id) {
		$customer = Customer::findOne ( $id );
		$card = Card::findOne ( $id );
		
		if ($customer == null) {
			throw new NotFoundHttpException ( 'The requested page does not exist.' );
		}
		
		$searchModel = new TicketSearchCustomer(['customer' => $customer]);
		$searchModel->id_card = $customer->id_customer_card;
		$dataProvider = $searchModel->search ( Yii::$app->request->queryParams );
		//$searchModel->searchTotals ();
		
		$searchModel->users = User::read ();
		$searchModel->accounts = Account::read ();
		$searchModel->ticketTypes = TicketType::read ();
		
		Url::remember(Url::current(),"ticket_index_customer");
		
		return $this->render ( 'index_customer', [ 
				'searchModel' => $searchModel,
				'dataProvider' => $dataProvider,
				'customer' => $customer,
				'card' => $card 
		] );
	}
	
	/**
	 * Displays a single Ticket model.
	 * 
	 * @param integer $id        	
	 * @return mixed
	 */
	public function actionView($id) {
		return $this->render ( 'view', [ 
				'model' => $this->findModel ( $id ) 
		] );
	}
	
	/**
	 * Creates a new Ticket model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 * 
	 * @return mixed
	 */
	public function actionCreate() {
		$model = new Ticket ();
		
		$discounts = Discount::read ();
		$ticketTypes = TicketType::read ();
		$accounts = Account::readAccounts ();
		
		if ($model->load ( Yii::$app->request->post () ) && $model->save ()) {
			return $this->redirect ( [ 
					'view',
					'id' => $model->id_ticket 
			] );
		} else {
			return $this->render ( 'create', [ 
					'model' => $model,
					'discounts' => $discounts,
					'ticketTypes' => $ticketTypes,
					'accounts' => $accounts 
			] );
		}
	}
	
	/**
	 * Updates an existing Ticket model.
	 * If update is successful, the browser will be redirected to the 'view' page.
	 * 
	 * @param integer $id        	
	 * @return mixed
	 */
	public function actionUpdate($id) {
		$model = TicketUpdate::findOne( $id );
		
		
		$model->startDate = substr( $model->start ,0 ,10 );
		$model->endDate = substr( $model->end ,0 ,10 );
		
		$model->startDate = \Yii::$app->formatter->asDate($model->startDate);
		$model->endDate = \Yii::$app->formatter->asDate($model->endDate);
		

		
		
		
		if ($model->load ( Yii::$app->request->post () ) && $model->save ()) {
			
			Helper::flash("success", "Bérlet sikeresen módosítva");
			
			$url = Url::previous("ticket_index_customer");
			
			if ( isset($url) ){
				return $this->redirect($url);
			}
			return $this->redirect ( [ 
					'view',
					'id' => $model->id_ticket 
			] );
		} else {
			return $this->render ( 'update', [ 
					'model' => $model 
			] );
		}
		
		
	}
	
	/**
	 * Deletes an existing Ticket model.
	 * If deletion is successful, the browser will be redirected to the 'index' page.
	 * 
	 * @param integer $id        	
	 * @return mixed
	 */
	public function actionDelete($id) {
		$this->findModel ( $id )->delete ();
		
		return $this->redirect ( [ 
				'index' 
		] );
	}
	
	public function actionTest(){
		
// 		$this->doTestTicketSale();

		$this->doTestDetstaProcess();
		
		return $this->render('test');
		
	}
	
	protected function doTestDetstaProcess(){
		$contract = Contract::findOne(19);
		$megbizas = $contract->requests[0];
		
		$tetel = new GiroDETSTATetel();
		$tetel->visszajelzesInformacio = "02";
		
		$tp = new DetStatTetelProcessor([
			'megbizas' => $megbizas,
			'tetel' => $tetel
		]);
		
		$tp->run();
		
	}
	
	protected function doTestTicketSale(){
		$ticketType = TicketType::findOne(1);
		$customer = Customer::findOne(1);
		$account = Account::findOne(1);
		$card = $customer->card;
		$discount = null;
		$contract = Contract::findOne(19);
		$megbizas = $contract->requests[0];
		
		
		
		$ticketSale = new TicketSale(
				[
						'ticketType'=>  $ticketType,
						'customer'=>  $customer,
						'account'=>  $account,
						'card'=>  $card,
						'discount'=>  $discount,
						'contract'=>  $contract,
						'ticketInstallmentRequest' => $megbizas
				]
				);
		
		$ticketSale->doSale();
	}
	
	/**
	 * Finds the Ticket model based on its primary key value.
	 * If the model is not found, a 404 HTTP exception will be thrown.
	 * 
	 * @param integer $id        	
	 * @return Ticket the loaded model
	 * @throws NotFoundHttpException if the model cannot be found
	 */
	protected function findModel($id) {
		if (($model = Ticket::findOne ( $id )) !== null) {
			return $model;
		} else {
			throw new NotFoundHttpException ( 'The requested page does not exist.' );
		}
	}
}
