<?php

namespace common\modules\product\models;

use common\behaviors\Slug;
use common\modules\rubrication\models\TaxOption;
use Yii;
use common\modules\relation\relationBehavior;
use yii\db\ActiveQuery;
use yii\helpers\Html;
use yii\web\UploadedFile;

/**
 * This is the model class for table "{{%product}}".
 *
 * @property string $name
 * @property integer $brand_id
 * @property integer $product_id
 * @property Category $category
 * @property array $categories
 * @property ProductVariant $variant
 * @property ProductImage $image
 * @property array $images
 * @property boolean $is_top
 * @property boolean $is_new
 */
class Product extends \yii\db\ActiveRecord
{
    /** @var array $_variants */
    public $_variants = [];

    /** @var array $_images */
    public $imagesUpload = [];
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => relationBehavior::className(),
                'relations' => [
                    'product_categories' => 'entity1', // Product category
                    'product_option' => 'entity1' // Product category
                ]
            ],
            [
                'class' => Slug::className(),
                'in_attribute' => 'name',
                'out_attribute' => 'alias',
                'translit' => true
            ]
        ];
    }

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

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['brand_id'], 'integer'],
            [['name'], 'string', 'max' => 150],
            [['alias'], 'string', 'max' => 250],
            [['categories', 'variants', 'options', 'imagesUpload'], 'safe'],
//            [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif', 'maxFiles' => 50],
            [['description', 'video'], 'safe'],
            [['is_top', 'is_new'], 'boolean'],
//            [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'product_id' => Yii::t('product', 'ID'),
            'name' => Yii::t('product', 'Name'),
            'brand_id' => Yii::t('product', 'Brand'),
            'categories' => Yii::t('product', 'Categories'), // relation behavior field
            'category' => Yii::t('product', 'Category'), // relation behavior field
            'image' => Yii::t('product', 'Image'),
            'images' => Yii::t('product', 'Images'),
            'description' => Yii::t('product', 'Description'),
            'video' => Yii::t('product', 'Video embeded'),
            'variants' => Yii::t('product', 'Variants'),
            'is_top' => Yii::t('product', 'Is top'),
            'is_new' => Yii::t('product', 'Is new'),
        ];
    }

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

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

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

    public function setImages($images) {
        $this->_images = $images;
    }

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

    public function getVariantPrice() {
        return $this->variant->price;
    }
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getVariants()
    {
        return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id']);
    }

    public function setVariants($variants) {
        $this->_variants = $variants;
    }

    public function getFullName()
    {
        return empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name;
    }

    public function getCategories() {
        return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']);
//        return $this->getRelations('product_categories');
    }

    public function getCategoriesNames() {
        $result = [];
        foreach($this->categories as $category) {
            $result[] = $category->name;
        }
        return $result;
    }

    public function getCategory() {
        return $this->hasOne(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']);
    }

    public function getOptions() {
        return $this->getRelations('product_option');
    }

    /**
     * @inheritdoc
     * @return ProductQuery the active query used by this AR class.
     */
    public static function find()
    {
        return new ProductQuery(get_called_class());
    }

    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);

//        $images = UploadedFile::getInstance($this, 'imagesUpload');
//        var_dump($images);exit;

//        if (!empty($this->imagesUpload)) {
//            if (!is_array($this->imagesUpload)) {
//                $this->imagesUpload = [$this->imagesUpload];
//            }
//            foreach($this->imagesUpload as $image) {
//                $image->saveAs((Yii::getAlias('@storage/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension)));
//            }
//
//
//        }

        if (!empty($this->_variants)) {
            $todel = [];
            foreach ($this->variants ?: [] as $_variant) {
                $todel[$_variant->product_variant_id] = $_variant->product_variant_id;
            }
            foreach ($this->_variants as $_variant) {
                if (!is_array($_variant)) {
                    return;
                }
                if (!empty($_variant['product_variant_id'])) {
                    unset($todel[$_variant['product_variant_id']]);
                    $model = ProductVariant::findOne($_variant['product_variant_id']);
                } else {
                    $model = new ProductVariant();
                }
                $_variant['product_id'] = $this->product_id;
                $model->load(['ProductVariant' => $_variant]);
                $model->save();
            }
            if (!empty($todel)) {
                ProductVariant::deleteAll(['product_variant_id' => $todel]);
            }
        }
    }

    public function beforeDelete() {
        ProductImage::deleteAll(['product_id' => $this->product_id]);
        ProductCategory::deleteAll(['product_id' => $this->product_id]);
        ProductVariant::deleteAll(['product_id' => $this->product_id]);
        return true;
    }

    public function imagesUpload()
    {
        if ($this->validate()) {
            $images = [];
            foreach ($this->imagesUpload as $image) {
                $imageName = $image->baseName .'.'. $image->extension;
                $i = 0;
                while(file_exists(Yii::getAlias('@storage/products/' . $imageName))) {
                    $i++;
                    $imageName = $image->baseName .'_'. $i .'.'. $image->extension;
                }

                $image->saveAs(Yii::getAlias('@storage/products/' .$imageName));
                $images[] = $imageName;
            }
            return $images;
        } else {
            return false;
        }
    }

    public function getImageUrl()
    {
        $image = empty($this->variant) ? null : $this->variant->image;
        return !empty($image) ? $image->imageUrl : '/storage/no_photo.png';
    }

    public function getImagesHTML() {
        $op = [];
        if ($this->images) {
            foreach ($this->images as $image) {
                $op[] = Html::img($image->imageUrl);
            }
        }
        return $op;
    }

    public function getImagesConfig() {
        $op = [];
        if ($this->images) {
            foreach ($this->images as $image) {
                $op[] = [
                    'caption' => $image->image,
                    'width' => '120px',
                    'url' => \yii\helpers\Url::to(['/product/manage/delimg', 'id' => $image->product_image_id]),
                    'key' => $image->product_image_id,
                    'extra' => [
                        'id' => $image->product_image_id,
                    ],
                ];
            }
        }
        return $op;
    }
}
