<?php

namespace common\modules\analyticsSchool\models;

use Yii;
use yii\web\UploadedFile;

/**
 * This is the model class for table "analytics_school_course".
 *
 * @property integer $id
 * @property string $name
 * @property string $description
 * @property string $image
 * @property UploadedFile $uploadedImage
 */
class AnalyticsSchoolCourse extends \common\components\ActiveRecordModel
{
    public $uploadedImage;
    protected $save_folder = ['uploads', 'courses'];

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

    /**
     * @return string
     */
    public function name(){
        return 'Курсы';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name'], 'required'],
            [['description', 'image'], 'string'],
            [['uploadedImage'], 'file', 'extensions' => ['pdf', 'jpeg', 'png']],
            [['name'], 'string', 'max' => 255],
        ];
    }

    /**
     * @param bool $insert
     * @return bool
     */
    public function beforeSave($insert){
        if (!parent::beforeSave($insert))
            return false;
        // Перед сохранением
        // Присваиваем свойству класс объекта с выгруженным изображением из формы
        $this->uploadedImage = UploadedFile::getInstance($this, 'uploadedImage');
        // Если свойство не пустое
        if (!is_null($this->uploadedImage)) {
            // Производим валидацию
            if (!$this->validate())
                // Если валидация неуспешная, возвращаем false
                return false;

            // Сгенерировали путь к папке
            $dirname = Yii::$app->security->generateRandomString(5);
            // Определили mime тип файла и занесли его в массив
            $fileFormat = explode('/', $this->uploadedImage->type);
            // Сгенерировали новое имя для файла
            $fileName = Yii::$app->security->generateRandomString(5).'.'.$fileFormat[1];
            // Определили папку в которую будет загружен файл
            $saveDir = $this->getPath().DIRECTORY_SEPARATOR.$dirname;
            // Если папка не найдена
            if (!is_dir($saveDir))
                // Создаем ее (рекурсивно)
                mkdir($saveDir, 0777, true);

            // Если до этого момента действие не было остановлено - сохраняем файл в файловой системе
            if ($this->uploadedImage->saveAs($saveDir.DIRECTORY_SEPARATOR.$fileName)) {
                // Переопределяем значение в поле
                $this->image = $this->getPath(false, '/').'/'.$dirname.'/'.$fileName;
            }
        }
        return true;
    }

    /**
     * @return bool
     */
    public function beforeDelete(){
        if (!parent::beforeDelete())
            return false;

        $filepath = Yii::getAlias('@frontend').$this->image;
        if (file_exists($filepath)) {
            unlink($filepath);
        }
        return true;
    }

    /**
     * @param bool $insert
     * @param array $changedAttributes
     */
    public function afterSave($insert, $changedAttributes){
        parent::afterSave($insert, $changedAttributes);
    }

    /**
     * Возвращает путь к папке для загрузки файлов
     *
     * Принимает два параметра true/false;
     * true - получаем абсолютный путь к директории;
     * false - получаем относительный путь к директории;
     * @param bool $absolute
     *
     * Принимает строку.
     * Является разделителем в пути;
     * @param string $delimiter
     *
     * @return string
     */
    public function getPath($absolute=true, $delimiter=DIRECTORY_SEPARATOR) {
        $path = $delimiter.'web'.$delimiter.(implode($delimiter, $this->save_folder));
        return ($absolute===true) ? Yii::getAlias('@frontend').$path : $path;
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Название курса',
            'description' => 'Описание',
            'image' => 'Изображение',
            'uploadedImage' => 'Изображение',
        ];
    }

    /**
     * @return array
     */
    public function behaviors(){
        return [];
    }
}
