<?php

class DefaultController extends Controller
{

    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/column2';

    /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules()
    {
        return array(
            array('allow', // allow all users to perform 'download'
                'actions' => array('download'),
                'users' => array('*'),
            ),
            array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array('index'),
                //'users'=>array('@'),
                'expression' => AccessManager::checkSessionPermission($this->module->name),
            ),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions' => array('create', 'update'),
                //'users'=>array('@'),
                'expression' => AccessManager::checkSessionPermission($this->module->name),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions' => array('delete'),
                //'users'=>array('@'),
                'expression' => AccessManager::checkSessionPermission($this->module->name),
            ),
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }

    public function actionDownload()
    {
        $file = $_REQUEST["file"];
        if ($file == "") {
            Log::w("Firmware-Deployment: no filename for download given!");
            return;
        }

        $attributes = array();

        $attributes["fileName"] = $file;
        $firmware = Firmware::model()->findByAttributes($attributes);

        if ($firmware == NULL) {
            Log::w("Firmware-Deployment: Firmware File not found!");
            return;
        }

        if ($firmware->data == "") {
            Log::w("Firmware-Deployment: File has no data!");
            return;
        }
        $length = 0;
        $data = "";
        if (!$firmware->getBinaryField("data", $data, $length)) {
            Log::w("Firmware-Deployment: Could not get file data!");
            return;
        }

        Log::v("Firmware-Deployment: Deploying File: " . $file);

        header('Content-Type: application/octet-stream');
        header("Content-Disposition: attachment; filename=\"$file\"");
        header("Content-Length: " . $length);
        echo $data;
    }

    public function getNormalizedVersionName($fileName)
    {
        return $fileName;

        $versionKeys = explode('.', $fileName);
        $v0 = str_pad((int) @$versionKeys[0], 2, '0', STR_PAD_LEFT);
        $v1 = str_pad((int) @$versionKeys[1], 2, '0', STR_PAD_LEFT);
        $v2 = str_pad((int) @$versionKeys[2], 2, '0', STR_PAD_LEFT);
        $v3 = str_pad((int) @$versionKeys[3], 2, '0', STR_PAD_LEFT);
        return $v0 . '.' . $v1 . '.' . $v2 . '.' . $v3;
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate()
    {
        $phones = new Phones();
        $phones = $phones->getPhoneManufactorAndModelNames();
        if ($phones['Grandstream']) {
            unset($phones['Grandstream']);
        }

        $model = new Firmware();
        $model->scenario = 'create';
        $this->performAjaxValidation($model);

        if (isset($_POST['Firmware'])) {
            $model->attributes = $_POST['Firmware'];
            $model->fileName = $_FILES['Firmware']['name']['data'];
            $tempPath = $_FILES['Firmware']['tmp_name']['data'];
            $model->version = $model->validateFirmware('data', array(), $tempPath);
            if ($model->save()) {}
        }
        $this->renderPartial('_form', array('phones' => $phones, 'model' => $model), false, true);
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id the ID of the model to be updated
     */
    public function actionUpdate($id)
    {
        $model = $this->loadModel($id);
        if ($model) {
            $fileName = $model->fileName;
            $data = $model->data;
        }
        $phones = new Phones();
        $phones = $phones->getPhoneManufactorAndModelNames();
        if ($phones['Grandstream']) {
            unset($phones['Grandstream']);
        }
        // Uncomment the following line if AJAX validation is needed
        $this->performAjaxValidation($model);

        if (isset($_POST['Firmware'])) {
            $model->attributes = $_POST['Firmware'];
            if ($_FILES['Firmware']['name']['data'] !== '') {
                $model->fileName = $_FILES['Firmware']['name']['data'];
                $tempPath = $_FILES['Firmware']['tmp_name']['data'];
                $model->version = $model->validateFirmware('data', array(), $tempPath);
            } else {
                $model->scenario = 'noFileChange';
                $model->fileName = $fileName;
                $model->data = $data;
            }
            if ($model->save()) {
                
            }
            //$this->redirect(array('view','id'=>$model->id));
        }
        $this->renderPartial('_form', array('phones' => $phones, 'model' => $model), false, true);
        //$this->renderPartial('update',array(
        //    'model'=>$model,
        //));
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'admin' page.
     * @param integer $id the ID of the model to be deleted
     */
    public function actionDelete($id)
    {
        if (Yii::app()->request->isPostRequest) {
            // we only allow deletion via POST request
            $this->loadModel($id)->delete();
            // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if (!isset($_GET['ajax'])) {
                $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
            }
        } else {
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
        }
    }

    /**
     * Lists all models.
     */
    public function actionIndex()
    {
        $model = new Firmware('search');
        if (isset($_GET['Firmware'])) {
            $model->attributes = $_GET['Firmware'];
        }

        $this->render('index', array(
            'model' => $model,
        ));
    }

    /**
     * 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 integer the ID of the model to be loaded
     */
    public function loadModel($id)
    {
        $model = Firmware::model()->findByPk($id);
        if ($model === null) {
            throw new CHttpException(404, 'The requested page does not exist.');
        }
        return $model;
    }

    /**
     * Performs the AJAX validation.
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model)
    {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'firmware-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }

    public function renderUseFirmware(Firmware $data)
    {
        $this->renderPartial('useFirmwareButton', array('data' => $data));
    }

    public function getHumanReadeblePhoneName($data)
    {
        $phones = new Phones();
        $phones = $phones->getPhoneManufactorAndModelNames();
        if ($phones['Grandstream']) {
            unset($phones['Grandstream']);
        }

        foreach ($phones as $manufactor => $phone) {
            if (isset($phones[$manufactor][$data->phoneType])) {
                $phoneName = $phones[$manufactor][$data->phoneType];
                return $phoneName;
            }
        }
        return $data->phoneType;
    }

    public function renderStandardColumn($data)
    {
        if ($data->standard) {
            return "<span class='icon-ok'></span>";
        }
    }
}
