<?php

namespace frontend\controllers;

use Yii;
use common\models\Product;
use frontend\models\ProductSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use frontend\models\ProductSaleForm;
use frontend\models\ProductLookupForm;
use common\models\Card;
use common\models\Customer;
use yii\base\DynamicModel;
use yii\base\Object;
use common\models\Currency;
use common\models\Account;
use common\models\Discount;
use common\models\Transfer;
use common\models\User;
use common\models\UserSoldItem;
use common\models\ShoppingCart;
use frontend\models\ReceptionForm;
use frontend\models\CustomerCartPayoutForm;
use frontend\models\UserCartPayoutForm;
use frontend\components\DefaultAccountBehavior;
use frontend\components\CassaOpenBehavior;
use common\components\ProductInventory;
use frontend\models\ProductInventorySearch;
use common\components\Helper;
use common\components\TransferPayout;

/**
 * ProductController implements the CRUD actions for Product model.
 */
class ProductController extends Controller {
	protected $card;
	protected $customer;
	public function behaviors() {
		return [ 
				'verbs' => [ 
						'class' => VerbFilter::className (),
						'actions' => [ 
								'delete' => [ 
										'post' 
								] 
						] 
				],
				'access' => [ 
						'class' => \yii\filters\AccessControl::className (),
						'only' => [ 
								'sale',
								'payout-customer-cart',
								'payout-user-cart',
								'lookup',
								'find' 
						],
						'rules' => [
								// allow authenticated users
								[ 
										'allow' => true,
										'roles' => [ 
												'@' 
										] 
								] 
						] 
				],
				// everything else is denied
				
				// named behavior, configuration array
				'defaultAccount' => [ 
						'class' => DefaultAccountBehavior::className () 
				],
				'cassaIsOpen' => [ 
						'class' => CassaOpenBehavior::className () 
				] 
		];
	}
	public function actionSale($number = null) {
		
		// $this->findByNumber($number);
		$receptionForm = new ReceptionForm ();
		$receptionForm->number = $number;
		$receptionForm->readCard ();
		
		$this->card = $receptionForm->card;
		$this->customer = $receptionForm->customer;
		
		$model = new ProductSaleForm ();
		
		$lookupModel = new ProductLookupForm ();
		
		$currencies = Currency::find ()->all ();
		
		$accounts = Account::read ();
		
		$discounts = Discount::readProductDiscounts();
		
		$user = User::findOne ( Yii::$app->user->id );
		
		$model->customer = $this->customer;
		$model->card = $this->card;
		
		$products = Product::readForDefaultAccount ();
		$products = Product::modelToMapIdName ( $products );
		
		$model->products = $products;
		
		if (Yii::$app->request->isAjax) {
			
			\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
			
			$model->currencies = $currencies;
			$model->accounts = $accounts;
			$model->discounts = $discounts;
			
			$model->id_account = Account::readDefault ();
			
			$result = [ ];
			$result ['code'] = 'unknown';
			if ($model->load ( Yii::$app->request->post () )) {
				if ($model->save ()) {
					
					$result ['code'] = 'success';
					$result ['message'] = Yii::t ( 'common/product', "Sold: {product}", [ 
							'product' => $model->transfer->toProductSoldString () 
					] );
				} else {
					$result ['code'] = 'invalid';
					$result ['errors'] = $model->getErrors ();
				}
			}
			
			$userTransfers = Transfer::modelsToArray ( Transfer::readUserSoldTransfers ( $user ) );
			$customerCart = Transfer::modelsToArray ( Transfer::readCustomerCart ( $this->customer ) );
			$result ['transfers'] = $userTransfers;
			$result ['customer_cart'] = $customerCart;
			
			return $result;
		} else {
			
			// $userTransfers = Transfer::readUserSoldTransfers( $user );
			$model->customerCart = Transfer::modelsToArray ( Transfer::readCustomerCart ( $this->customer ) );
			$userTransfers = Transfer::modelsToArray ( Transfer::readUserSoldTransfers ( $user ) );
			
			return $this->render ( "sale", [ 
					'customer' => $this->customer,
					'card' => $this->card,
					'model' => $model,
					'lookupModel' => $lookupModel,
					'currencies' => $currencies,
					'accounts' => $accounts,
					'discounts' => $discounts,
					'userTransfers' => $userTransfers,
					'receptionForm' => $receptionForm 
			] );
		}
	}
	public function actionPayoutUserCart() {
		$model = new UserCartPayoutForm ();
		$user = User::findOne ( Yii::$app->user->id );
		
		if ($model->load ( Yii::$app->request->post () ) && $model->validate () && isset ( $user ) && count ( $model->transfers ) > 0) {
			
			$connection = \Yii::$app->db;
			$transaction = $connection->beginTransaction ();
			try {
				$tp = new TransferPayout ( [ 
						'idUser' => \Yii::$app->user->id,
						'idTransfers' => $model->transfers,
						'cartType' => 'user',
						'idAccount' => Account::readDefault () 
				] );
				
				$tp->payout ();
				
				// UserSoldItem::payout ( $user, $model->transfers );
				$transaction->commit ();
				\Yii::$app->session->setFlash ( 'success', 'Recepicó kosár fizetve' );
			} catch ( Exception $e ) {
				$transaction->rollback ();
				Yii::error ( "faled to save :" . $e->getMessage () );
			} catch ( \Exception $e ) {
				$transaction->rollback ();
				Yii::error ( "faled to save :" . $e->getMessage () );
			}
		} else {
			Yii::error ( "faled to save :   transfer" );
			\Yii::$app->session->setFlash ( 'warning', 'Nem történt változás' );
		}
		
		return $this->redirect ( Yii::$app->request->referrer );
	}
	
	
	public function actionPayoutCustomerCart($number) {
		$cart = [ ];
		$code = 'error';
		$message = 'Hiba történt';
		
		// post
		$model = new CustomerCartPayoutForm ();
		
		if ($model->load ( Yii::$app->request->post () ) && $model->validate ()) {
			
			$this->findByNumber ( $number );
			
			if (isset ( $this->customer ) && count ( $model->transfers ) > 0) {
				$connection = \Yii::$app->db;
				$transaction = $connection->beginTransaction ();
				try {
					$tp = new TransferPayout ( [ 
							'idUser' => \Yii::$app->user->id,
							'idTransfers' => $model->transfers,
							'cartType' => 'customer',
							'idAccount' => Account::readDefault (),
							'idCustomer' => $this->customer->id_customer 
					] );
					
					$tp->payout ();
					
					// UserSoldItem::payout ( $user, $model->transfers );
					$transaction->commit ();
					\Yii::$app->session->setFlash ( 'success', 'Vendég kosár fizetve : ' . $this->customer->name );
				} catch ( Exception $e ) {
					$transaction->rollback ();
					Yii::error ( "faled to save :" . $e->getMessage () );
				} catch ( \Exception $e ) {
					$transaction->rollback ();
					Yii::error ( "faled to save :" . $e->getMessage () );
				}
			} else {
				Yii::error ( "faled to save : no customer or transfer" );
				\Yii::$app->session->setFlash ( 'warning', 'Nem történt kifizetés' );
			}
		} else {
			\Yii::$app->session->setFlash ( 'warning', 'Nem történt változás' );
		}
		return $this->redirect ( Yii::$app->request->referrer );
	}
	
	/**
	 */
	public function actionLookup($query = null) {
		$result = [ ];
		$product = Product::findProduct ( $query, Account::readDefault () );
		$product = Product::modelToArray ( $product );
		
		$result ['product'] = $product;
		
		\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
		
		return $result;
	}
	
	/**
	 */
	public function actionFind($id = null) {
		$result = [ ];
		$product = Product::findOne ( $id );
		$product = Product::modelToArray ( $product );
		
		$result ['product'] = $product;
		
		\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
		
		return $result;
	}
	public function actionInventory() {
		$searchModel = new ProductInventorySearch ( [ 
				'account' => Account::readDefaultObject () 
		] );
		
		// $searchModel->search(\Yii::$app->request->params);
		$dataProvider = $searchModel->search ( Yii::$app->request->queryParams );
		
		// $inventory = new ProductInventory([
		// ]);
		// if ( $output == 'xls'){
		// $inventory->pagination = false;
		// }
		
		// $inventory->createDataProvider();
		// $dp = $inventory->dataProvider;
		
		if ($searchModel->output == 'xls') {
			
			$models = $dataProvider->getModels ();
			$objPHPExcel = new \PHPExcel ();
			
			$sheet = $objPHPExcel->setActiveSheetIndex ( 0 );
			/**
			 * Termék azonosító Termék neve Termék szám Termék vonalkód Termék raktáron Termék eladva
			 */
			$row = 1;
			$sheet->setCellValue ( 'A' . $row, "Termék azonosító" )->setCellValue ( 'B' . $row, "Termék név" )->setCellValue ( 'C' . $row, "Termék szám" )->setCellValue ( 'D' . $row, "Termék vonalkód" )->setCellValue ( 'E' . $row, "Termék raktáron" );
			// ->setCellValue('F'.$row, "Eladott mennyiség");
			
			foreach ( $models as $model ) {
				$row ++;
				$sheet->setCellValue ( 'A' . $row, $model ['product_id'] )->setCellValue ( 'B' . $row, $model ['product_name'] )->setCellValue ( 'C' . $row, $model ['product_number'] )->setCellValue ( 'D' . $row, $model ['product_barcode'] )->setCellValue ( 'E' . $row, $model ['product_stock'] );
				// ->setCellValue('F'.$row, $model['product_sold']);
			}
			
			$styleArray = array (
					'font' => array (
							'bold' => true 
					) 
			);
			// 'color' => array('rgb' => 'FF0000'),
			// 'size' => 15,
			// 'name' => 'Verdana'
			
			
			
			foreach ( range ( 'A', 'E' ) as $columnID ) {
				$sheet->getColumnDimension ( $columnID )->setAutoSize ( true );
				$sheet->getStyle ( $columnID . '1' )->applyFromArray ( $styleArray );
			}
			
			// Redirect output to a client’s web browser (Excel5)
			header ( 'Content-Type: application/vnd.ms-excel' );
			header ( 'Content-Disposition: attachment;filename="leltar.xls"' );
			header ( 'Cache-Control: max-age=0' );
			// If you're serving to IE 9, then the following may be needed
			header ( 'Cache-Control: max-age=1' );
			// If you're serving to IE over SSL, then the following may be needed
			header ( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' ); // Date in the past
			header ( 'Last-Modified: ' . gmdate ( 'D, d M Y H:i:s' ) . ' GMT' ); // always modified
			header ( 'Cache-Control: cache, must-revalidate' ); // HTTP/1.1
			header ( 'Pragma: public' ); // HTTP/1.0
			$objWriter = \PHPExcel_IOFactory::createWriter ( $objPHPExcel, 'Excel5' );
			$objWriter->save ( 'php://output' );
			exit ();
		}
		
		return $this->render ( 'inventory', [ 
				'searchModel' => $searchModel,
				'dataProvider' => $dataProvider 
		] );
	}
	
	/**
	 * Finds the Product model based on its primary key value.
	 * If the model is not found, a 404 HTTP exception will be thrown.
	 *
	 * @param integer $id        	
	 * @return Product the loaded model
	 * @throws NotFoundHttpException if the model cannot be found
	 */
	protected function findModel($id) {
		if (($model = Product::findOne ( $id )) !== null) {
			return $model;
		} else {
			throw new NotFoundHttpException ( 'The requested page does not exist.' );
		}
	}
	protected function findByNumber($number) {
		$this->card = null;
		$this->customer = null;
		if ($number != null) {
			$this->card = Card::readCard ( $number );
			if ($this->card != null) {
				$this->customer = Customer::find ()->innerJoin ( Card::tableName (), "customer.id_customer_card = card.id_card" )->andWhere ( [ 
						'customer.id_customer_card' => $this->card->id_card 
				] )->one ();
			}
		}
	}

/**
 * Lists all Product models.
 *
 * @return mixed
 */
	/*
	 * public function actionIndex()
	 * {
	 * $searchModel = new ProductSearch();
	 * $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
	 *
	 * return $this->render('index', [
	 * 'searchModel' => $searchModel,
	 * 'dataProvider' => $dataProvider,
	 * ]);
	 * }
	 */
/**
 * Displays a single Product model.
 *
 * @param integer $id        	
 * @return mixed
 */
	/*
	 * public function actionView($id)
	 * {
	 * return $this->render('view', [
	 * 'model' => $this->findModel($id),
	 * ]);
	 * }
	 */
/**
 * Updates an existing Product 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_product]);
	 * } else {
	 * return $this->render('update', [
	 * 'model' => $model,
	 * ]);
	 * }
	 * }
	 */
/**
 * Deletes an existing Product 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']);
	 * }
	 */
/**
 * Creates a new Product model.
 * If creation is successful, the browser will be redirected to the 'view' page.
 *
 * @return mixed
 */
	/*
	 * public function actionCreate()
	 * {
	 * $model = new Product();
	 *
	 * if ($model->load(Yii::$app->request->post()) && $model->save()) {
	 * return $this->redirect(['view', 'id' => $model->id_product]);
	 * } else {
	 * return $this->render('create', [
	 * 'model' => $model,
	 * ]);
	 * }
	 * }
	 */
}
