<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Luis
 * Date: 16/12/13
 * Time: 20:55
 * To change this template use File | Settings | File Templates.
 */

use Auth\Model_Auth_Role;
use Auth\Model_Auth_GroupRole;
use Auth\Model_Auth_Group;
use Fuel\Core\Response;
use \Parser\View;

class Controller_Administracion_Grupos_Index extends \Controller_App{

    //Variable para guardar las migas de pan que van a aparecer en las vistas
    private $_bc = array();

    //Array con los elementos del menu que se deben marcar con la clase "active" para que esten seleccionados en el menu.
    private $_option_menu=array('maestras','grupos');

    public function before(){

        //Se cargan funciones de javascript especificas de esta funcionalidad
        Casset::js('administracion/grupos/index.js');

        //Se marca la navegación en forma de migas de pan. Cada miga de pan la forman dos variables:
        //  ds  : String a mostrar
        //  url : url del enlace en modo absoluto
        $this->_bc[] = array('ds'=>'Inicio','url'=>'/dashboard');
        $this->_bc[] = array('ds'=>'Maestras','url'=>'/dashboard');
        $this->_bc[] = array('ds'=>'Perfiles','url'=>'/grupos','class'=>'active');

        parent::before();
    }

    public function get_index()
    {
        $view = View::forge('administracion/grupos/index.twig');

        $view->grupos = Model_Auth_Group::query()->get();
        $view->roles = Model_Auth_Role::query()->order_by('orden','asc')->get();

        //Titulo de la vista
        $view->title = "Gestión de Perfiles";

        //Paso de las migas de pan a la vista
        $view->bc = $this->_bc;

        //Paso de las opciones de menu que deben aparecer seleccionadas
        $view->option_menu = $this->_option_menu;

        return Response::forge($view);
    }

    public function get_show($id)
    {
        //Se recuperan los datos a mostrar en la vista que peuden cambair en función de como se llame a esa vista
        $grupo = Model_Auth_Group::query()->where('id', $id)->get_one();

        return $this->load_show($grupo);
    }

    public function load_show($grupo){

        //Se selecciona la vista a devolver
        $view = View::forge('administracion/grupos/form.twig');

        //En funcion del tipo, cambia el titulo
        $view->title = "Detalle de Perfil";

        //Se recuperan los datos de los desplegables de la vista
        $view->roles = Model_Auth_Role::query()->order_by('orden','asc')->get();

        //Se añaden los datos a la vista
        $view->grupo = $grupo;

        //Se añade una miga de pan a la vista
        $this->_bc[] = array('ds'=>$view->title,'url'=>'','class'=>'active');

        //Paso de las migas de pan a la vista
        $view->bc = $this->_bc;

        //Paso de las opciones de menu que deben aparecer seleccionadas
        $view->option_menu = $this->_option_menu;

        return Response::forge($view);
    }

    public function get_update($id)
    {
        //Se recuperan los datos a mostrar en la vista que peuden cambair en función de como se llame a esa vista
        $grupo = Model_Auth_Group::query()->where('id',$id)->get_one();

        //  A : Alta || M : Modificacion
        if($id == 0){
            return $this->load_form($grupo, 'A');
        }else{
            return $this->load_form($grupo, 'M');
        }
    }

    public function post_update()
    {
        $name = Input::post('nombre','');
        $roles = Input::post('roles');
        $id = Input::post('id','');

        $found = Model_Auth_Group::query()->where('nombre' , $name)->get_one();

        //nombre no existente
        if (((is_null($found) || $found == "" ) && count($roles) > 0))
        {
            //grupo no existente
            $grupo = Model_Auth_Group::forge();

            if($id != '')//grupo existente
            {
                $grupo = Model_Auth_Group::query()->where("id",$id)->get_one();

                //elimina roles que el grupo tuviera
                foreach($grupo->roles as $role) $role->delete();
                $grupo->roles = null;
            }

            //establece nombre grupo
            $grupo->nombre = $name;

            //crea fila en GroupRole con roles selecionados para el grupo
            foreach($roles as $role)
            {
                $grupoRole = Model_Auth_GroupRole::forge();
                $grupoRole->role_id = $role;
                $grupo->roles[] = $grupoRole;
            }

            //guarda grupo
            $grupo->save();

            Session::set_flash('message',array('type'=>'success','text'=>'Modificaciones realizadas con éxito'));
            Response::redirect('grupos');

        }
        //nombre existente
        else if(($found) && count($roles) > 0)
        {
            if($id != '')//grupo existente
            {
                $grupo = Model_Auth_Group::query()->where("id",$id)->get_one();

                //grupo existente
                //si el 'id' del grupo es igual al 'id' de la fila encontrada, estamos editando
                if($grupo->id == $found->id)
                {
                    //elimina roles que el grupo tuviera
                    foreach($grupo->roles as $role) $role->delete();
                    $grupo->roles = null;

                    //el nombre del grupo no ha cambiado, no lo sobreescribimos

                    //crea fila en GroupRole con roles selecionados para el grupo
                    foreach($roles as $role)
                    {
                        $grupoRole = Model_Auth_GroupRole::forge();
                        $grupoRole->role_id = $role;
                        $grupo->roles[] = $grupoRole;
                    }

                    //guarda grupo
                    $grupo->save();

                    Session::set_flash('message',array('type'=>'success','text'=>'Modificaciones realizadas con éxito'));
                    Response::redirect('grupos');
                }
                //grupo existente y nombre existente en otro grupo
                else
                {
                    Session::set_flash('message',array('type'=>'error','text'=>'No se ha podido realizar la grabación con éxito. El nombre de grupo ya está en uso.'));
                    Response::redirect('grupos');
                }
            }
            //grupo no existente
            else
            {
                Session::set_flash('message',array('type'=>'error','text'=>'No se ha podido realizar la grabación con éxito. El nombre de grupo ya está en uso.'));
                Response::redirect('grupos');
            }
        }
        else
        {
            Session::set_flash('message',array('type'=>'error','text'=>'No se ha podido realizar la grabación con éxito. Debes seleccionar algún rol.'));
            Response::redirect('grupos');
        }
    }

    public function load_form($grupo, $tipo){

        //Se selecciona la vista a devolver
        $view = View::forge('administracion/grupos/form.twig');

        //En funcion del tipo, cambia el titulo
        $view->title = (($tipo=='A')?"Alta":"Modificación")." de Perfiles";

        //Se recuperan los datos de los desplegables de la vista
        $view->roles = Model_Auth_Role::query()->get();

        //Se añaden los datos a la vista
        $view->grupo = $grupo;

        //Se añade una miga de pan a la vista
        $this->_bc[] = array('ds'=>$view->title,'url'=>'','class'=>'active');

        //Paso de las migas de pan a la vista
        $view->bc = $this->_bc;

        //Paso de las opciones de menu que deben aparecer seleccionadas
        $view->option_menu = $this->_option_menu;

        return Response::forge($view);
    }

    public function post_delete()
    {
        $id = Input::post('id','');

        $grupo = Model_Auth_Group::query()->where("id",$id)->get_one();

        if ($grupo && $grupo != "" )
        {
        //elimina roles que el grupo tuviera
        foreach($grupo->roles as $role) $role->delete();
        $grupo->roles = null;

        $grupo->delete();
        }

        Session::set_flash('message',array('type'=>'success','text'=>'Modificaciones realizadas con éxito'));
        Response::redirect('grupos');
    }

}