<?php

namespace common\modules\product\models;


use common\components\artboxtree\ArtboxTreeBehavior;
use common\components\artboxtree\ArtboxTreeHelper;
use common\modules\rubrication\models\TaxOption;
use yii\db\ActiveQuery;
use common\modules\rubrication\models\TaxGroup;
use Yii;

use yii\db\Query;
use common\behaviors\Slug;
/**
 * This is the model class for table "category".
 *
 * @property integer $category_id
 * @property string $remote_id
 * @property integer $parent_id
 * @property string $path
 * @property integer $depth
 * @property string $image
 * @property string $meta_title
 * @property string $meta_desc
 * @property string $meta_robots
 * @property string $seo_text
 * @property integer $category_name_id
 * @property integer $product_unit_id
 * @property string $alias
 * @property boolean $populary
 * @property boolean $name
 *
 * @property CategoryName $categoryName
 * @property Product[] $products
 * @property ProductUnit $productUnit
 * @property CategoryName[] $categoryNames
 * @property ProductCategory[] $productCategories
 * @property TaxGroup $TaxGroup
 */
class Category extends \yii\db\ActiveRecord
{
    public $imageUpload;

    public function behaviors()
    {
        return [
            'artboxtree' => [
                'class' => ArtboxTreeBehavior::className(),
                'keyNameGroup' => null,
                'keyNamePath' => 'path',
            ],
            'slug' => [
                'class' => 'common\behaviors\Slug',
                'in_attribute' => 'name',
                'out_attribute' => 'alias',
                'translit' => true
            ],

        ];
    }

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'category';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name'], 'string'],
            [['parent_id', 'depth', 'category_name_id', 'product_unit_id'], 'integer'],
            [['path', 'meta_desc', 'h1', 'seo_text'], 'string'],
            [['meta_title', 'image'], 'string', 'max' => 255],
            [['meta_robots'], 'string', 'max' => 50],
            [['alias', 'name'], 'string', 'max' => 250],
            [['populary'], 'boolean'],
            [['imageUpload','taxGroup'], 'safe'],
            [['imageUpload'], 'file', 'extensions' => 'jpg, gif, png'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'category_id' => Yii::t('product', 'Category ID'),
            'parent_id' => Yii::t('product', 'Parent ID'),
            'path' => Yii::t('product', 'Path'),
            'depth' => Yii::t('product', 'Depth'),
            'image' => Yii::t('product', 'Image'),
            'imageUrl' => Yii::t('product', 'Image'),
            'meta_title' => Yii::t('product', 'Meta Title'),
            'meta_desc' => Yii::t('product', 'Meta Desc'),
            'meta_robots' => Yii::t('product', 'Meta Robots'),
            'h1' => Yii::t('product', 'h1'),
            'seo_text' => Yii::t('product', 'Seo Text'),
            'product_unit_id' => Yii::t('product', 'Product Unit ID'),
            'alias' => Yii::t('product', 'Alias'),
            'populary' => Yii::t('product', 'Populary'),
            'name' => Yii::t('product', 'Name'),
            'remote_id' => Yii::t('product', 'Remote ID'),
        ];
    }

    public static function find()
    {
        return new CategoryQuery(get_called_class());
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getProductUnit()
    {
        return $this->hasOne(ProductUnit::className(), ['product_unit_id' => 'product_unit_id']);
    }

    public function getProducts() {
        return $this->hasMany(Product::className(), ['product_id' => 'product_id'])
            ->viaTable('product_category', ['category_id' => 'category_id']);
    }


    /**
     * @return \yii\db\ActiveQuery
     */
    public function getProductCategories()
    {
        return $this->hasMany(ProductCategory::className(), ['category_id' => 'category_id']);
    }

    public function getBrands(){
        return $this->getProducts()->select('brand.*')->joinWith('brand')->groupBy('brand.brand_id');

    }

    public function getTaxGroupsByLevel($level)
    {
        return $this->hasMany(TaxGroup::className(), ['tax_group_id' => 'tax_group_id'])
            ->viaTable('tax_group_to_category', ['category_id' => 'category_id'])
            ->andWhere(['level' => $level]);
    }

    public function getRemote_category()
    {
        return ArtboxTreeHelper::getArrayField($this->remote_id);
    }

    public function setRemote_category($value)
    {
        if (!empty($value) && is_array($value)) {
            $this->remote_id = ArtboxTreeHelper::setArrayField($value, false);
        }
    }




    public function getImageFile() {
        return empty($this->image) ? '/storage/no_photo.png' : Yii::getAlias('@imagesDir/categories/'. $this->image);
    }

    public function getImageUrl()
    {
        return empty($this->image) ? '/storage/no_photo.png' : Yii::getAlias('@imagesUrl/categories/' . $this->image);
    }

    public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {

            if (empty($this->parent_id))
                $this->parent_id = 0;

            return true;
        }
        return false;
    }

    public function beforeDelete()
    {

        if(!empty($this->products)){
            foreach($this->products as $product){
                $product->delete();
            }
        }
        ProductCategory::deleteAll(['category_id' => $this->category_id]);
        return true;
    }

    /**
     * @param array $product_id
     * @param array $product_variant_id
     * @return  ActiveQuery
     */

    public function getFilterQuery( $product_id = [], $product_variant_id = []){
        $query1 = (new Query())
            ->distinct()
            ->select([
                'option_id'
            ])
            ->from('tax_option')
            ->innerJoin('product_variant_option', 'tax_option.tax_option_id = product_variant_option.option_id')
            ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id')
            ->innerJoin('product_variant', 'product_variant.product_variant_id = product_variant_option.product_variant_id')
            ->innerJoin('product', 'product.product_id = product_variant.product_id')
            ->innerJoin('product_category', 'product_category.product_id = product.product_id')
            ->innerJoin('tax_group_to_category', 'tax_group.tax_group_id = tax_group_to_category.tax_group_id')
            ->where(['product_category.category_id' => $this->category_id,
                'tax_group.is_filter' => TRUE,
                'tax_group_to_category.category_id'=>$this->category_id,

            ])
            ->filterWhere([
                'product_variant_option.product_variant_id' => $product_variant_id
            ])
            ->andWhere(['!=', 'product_variant.status', 1]);

        $query2 = (new Query())
            ->distinct()
            ->select([
                'option_id'
            ])
            ->from('tax_option')
            ->innerJoin('product_option', 'tax_option.tax_option_id = product_option.option_id')
            ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id')
            ->innerJoin('product', 'product.product_id = product_option.product_id')
            ->innerJoin('product_category', 'product_category.product_id = product.product_id')
            ->innerJoin('product_variant', 'product_variant.product_id = product.product_id')
            ->innerJoin('tax_group_to_category', 'tax_group.tax_group_id = tax_group_to_category.tax_group_id')
            ->where(['product_category.category_id' => $this->category_id,
                'tax_group.is_filter' => TRUE,
                'tax_group_to_category.category_id'=>$this->category_id,
            ])
            ->filterWhere([
                'product_option.product_id' => $product_id
            ])
            ->andWhere(['!=', 'product_variant.status', 1]);
        $query3 = (new Query())
            ->select([
                'tax_option.*',
                'tax_group.*',
                'tax_option.alias as option_alias',
                'tax_group.alias as group_alias',
                'tax_option.name as value',
                'tax_option.sort AS tax_option_sort',
                'tax_group.sort AS tax_group_sort',
            ])
            ->from(['tax_option' ])
            ->where(['tax_option.tax_option_id'=>$query1->union($query2)])

            ->innerJoin('tax_group','tax_group.tax_group_id = tax_option.tax_group_id')
            ->orderBy('tax_option.sort, tax_group.sort');
        return $query3;
    }

    /**
     * @return mixed
     * @throws \Exception
     */


    public function getActiveFilters() {
        return Category::getDb()->cache(function(){
            return $this->getFilterQuery()->all();
        }, 3600);

    }

    /**
     * @param array $product_id
     * @param array $product_variant_id
     * @return mixed
     */
    public function getSelectFilters($product_id = [], $product_variant_id = []) {

        return $this->getFilterQuery($product_id, $product_variant_id)->select('tax_option_id')->column();

    }


    public function getTaxGroupsForMenu()
    {

        $connection = Yii::$app->getDb();
        $command = $connection->createCommand('
                SELECT ton.alias as option_alias,ton.name as value, *
                FROM tax_option as ton
                RIGHT JOIN tax_group ON ton.tax_group_id = tax_group.tax_group_id
                RIGHT JOIN tax_group_to_category ON tax_group.tax_group_id = tax_group_to_category.tax_group_id
                WHERE  ton.tax_option_id IN (
                SELECT po.option_id FROM product_option as po
                WHERE po.product_id IN (
                        SELECT product_id FROM product_category WHERE category_id = :category_id
                    )
                )
                AND tax_group.is_menu = true AND tax_group_to_category.category_id = :category_id',
            [
                ':category_id' => $this->category_id

            ]);
        return $command->queryAll();



    }


    public function setTaxGroup($value)
    {
        return $this->taxgroup = $value;
    }

    public function getTaxGroup()
    {
        return $this->hasMany(TaxGroup::className(), ['tax_group_id' => 'tax_group_id'])
            ->viaTable('tax_group_to_category', ['category_id' => 'category_id']);
    }

}
