<?php

abstract class CrudAction extends NodeAction
{
    public $modelName = 'QuestionCategory';
    public $i18ModelName = 'QuestionCategoryI18n';

    public $viewAlias = 'questionCategory';

    public function init()
    {
        parent::init();
        if (!isset($this->i18ModelName))
            $this->i18ModelName = $this->modelName . 'I18n';

    }

    public function run($crudAction = 'admin')
    {
        $this->init();
        switch ($crudAction) {
            case 'admin':
                $this->actionAdmin();
                break;
            case 'create':
                $this->actionCreate();
                break;
            case 'update':
                $this->actionUpdate($_GET['id']);
                break;
            case 'delete':
                $this->actionDelete($_GET['id']);
                break;
            case 'order':
                $this->actionOrder();
                break;
        }
    }

    public function actionCreate()
    {
        /** @var $model INodeCrudModel|CActiveRecord */
        $model = new $this->modelName;
        $model->setNode($this->node);
        $i18nModels = array();
        foreach (Yii::app()->params['languages'] as $lang) {
            $i18nModel = new $this->i18ModelName;
            $i18nModel->lang = $lang;
            $i18nModels[$lang] = $i18nModel;
        }

        if (isset($_POST[$this->modelName]) || isset($_POST[$this->i18ModelName])) {

            if (isset($_POST[$this->modelName]))
                $model->attributes = $_POST[$this->modelName];
            $i18nValidation = true;
            if (isset($_POST[$this->i18ModelName])) {
                foreach ($_POST[$this->i18ModelName] as $lang => $post) {
                    $i18nModels[$lang]->attributes = $post;
                    $i18nValidation = $i18nValidation && $i18nModels[$lang]->validate();
                }
            }
            if ($model->validate() && $i18nValidation) {
                $model->i18ns = $i18nModels;
                $model->save(false);
                foreach ($i18nModels as $i18nModel) {
                    $i18nModel->id = $model->id;
                    $i18nModel->save();
                }
                $params =array('crudAction' => 'admin') + $_GET;
                unset($params['id']);
                $this->controller->redirect($this->controller->createUrl('', $params));
            }

        }

        $this->controller->render($this->resolveView('create'), array(
            'model' => $model,
            'i18nModels' => $i18nModels,
        ));
    }

    public function actionUpdate($id)
    {
        $model = $this->loadModel($id);
        $i18nModels = array();
        foreach (Yii::app()->params['languages'] as $lang) {
            if (!isset($model->i18ns[$lang])) {
                $i18nModel = new $this->i18ModelName;
                $i18nModel->id = $model->id;
                $i18nModel->lang = $lang;
                $i18nModels[$lang] = $i18nModel;
            } else {
                $i18nModels[$lang] = $model->i18ns[$lang];
            }
        }

        if (isset($_POST[$this->modelName]) || isset($_POST[$this->i18ModelName])) {

            if (isset($_POST[$this->modelName]))
                $model->attributes = $_POST[$this->modelName];
            $i18nValidation = true;
            if (isset($_POST[$this->i18ModelName])) {
                foreach ($_POST[$this->i18ModelName] as $lang => $post) {
                    $i18nModels[$lang]->attributes = $post;
                    $i18nValidation = $i18nValidation && $i18nModels[$lang]->validate();
                }
            }
            if ($model->validate() && $i18nValidation) {
                $model->i18ns = $i18nModels;
                $model->save(false);
                foreach ($i18nModels as $i18nModel) {
                    $i18nModel->save();
                }
                $params =array('crudAction' => 'admin') + $_GET;
                unset($params['id']);
                $this->controller->redirect($this->controller->createUrl('', $params));
            }

        }

        $this->controller->render($this->resolveView('update'), array(
            'model' => $model,
            'i18nModels' => $i18nModels,
        ));
    }

    public function actionDelete($id)
    {
        if (Yii::app()->request->isPostRequest) {
            $model = $this->loadModel($id);
            $model->delete();
            if (!isset($_GET['ajax']))
                $this->controller->redirect(
                    isset($_POST['returnUrl'])
                        ? $_POST['returnUrl']
                        : $this->controller->createUrl('', array('crudAction' => 'admin') + $_GET)
                );
        } else
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
    }

    public function actionAdmin()
    {
        /** @var $model CActiveRecord|INodeCrudModel */
        $model = new $this->modelName('search');
        $model->unsetAttributes(); // clear any default values
        $model->setNode($this->node);
        foreach ($model->getAttributes() as $k => $v) {
            if (isset($_GET[$k])) {
                $model->$k = $_GET[$k];
            }
        }
        if (isset($_GET[$this->modelName]))
            $model->attributes = $_GET[$this->modelName];

        $this->controller->render($this->resolveView('admin'), array(
            'model' => $model,
        ));
    }

    public function actionOrder()
    {
        if (Yii::app()->request->isPostRequest && isset($_POST['Order'])) {
            if ($_POST['Order'] != 'none') {
                $models = explode(',', $_POST['Order']);
                for ($i = 0; $i < sizeof($models); $i++) {
                    if ($model = $this->loadModel($models[$i])) {
                        $model->rank = $i;
                        $model->save();
                    }
                }
            }
            $this->controller->redirect($this->controller->createUrl('', array('crudAction' => 'admin') + $_GET));
        } else {
            $dataProvider = new CActiveDataProvider(
                $this->modelName,
                array(
                    'pagination' => false,
                    'criteria' => array(
                        'condition' => $this->orderCondition(),
                        'order' => '`rank` ASC, id DESC',
                    ),
                ));
            $this->controller->render(
                $this->resolveView('order'),
                array(
                    'dataProvider' => $dataProvider,
                ));
        }
    }

    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param $id
     * @throws CHttpException
     * @return  CActiveRecord
     * @internal param \the $integer ID of the model to be loaded
     */
    public function loadModel($id)
    {
        $class = $this->modelName;
        $model = call_user_func_array(array(&$class, 'model'), array());


        $model = $model->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

    /**
     * @return string
     */
    public function orderCondition(){
        return '';
    }
}
