<?php namespace Eae\Backoffice;

use Lang;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use DB;
use Config;

class Grid{
    
    const SEARCH_OPTION_EQUAL = 'eq';
    const SEARCH_OPTION_LESS = 'lt';
    const SEARCH_OPTION_LESS_OR_EQUAL = 'le';
    const SEARCH_OPTION_GREATER = 'gt';
    const SEARCH_OPTION_GREATER_OR_EQUAL = 'ge';
    const SEARCH_OPTION_CONTAINS = 'cn';
    
    private $rowNum = 10;
    private $rowList = array(10, 50, 100); 
    
    public function fillQueryFilter($query, $gridFilters){
        if(!empty($gridFilters)){
            foreach($gridFilters as $gridFilter){
                switch($gridFilter->op){
                    case Grid::SEARCH_OPTION_EQUAL:
                        $query->where($gridFilter->field, '=', $gridFilter->data); 
                        break;
                    case Grid::SEARCH_OPTION_CONTAINS:  //contains
                        $query->where($gridFilter->field, 'like', "%" . $gridFilter->data . "%"); 
                        break;
                    case Grid::SEARCH_OPTION_LESS_OR_EQUAL:  //less or equal
                        $query->where($gridFilter->field, '<=', $gridFilter->data); 
                        break;
                    case Grid::SEARCH_OPTION_LESS:  //less 
                        $query->where($gridFilter->field, '<', $gridFilter->data); 
                        break;
                    case Grid::SEARCH_OPTION_GREATER_OR_EQUAL:  //greater or equal
                        $query->where($gridFilter->field, '>=', $gridFilter->data); 
                        break;
                    case Grid::SEARCH_OPTION_GREATER:  //greater
                        $query->where($gridFilter->field, '>', $gridFilter->data); 
                        break;
                    default:
                        break;    
                }    
            }
        }
        
        return $query;
    } 
    
    public function getScript($gridId, $url, $columns, $actions = NULL, $gridParams = NULL){
        
        if(!empty($gridParams)){
            foreach($gridParams as $param){
                if(isset($this->param)){
                    $this->param = $param;    
                }
            }
        }   
        
        $gridJs = '<script>$(document).ready(function(){';
        $gridJs .= '$("#'.$gridId.'").jqGrid({';
        $gridJs .= "url: '".url($url)."',";
        $gridJs .= "datatype: 'json',";
        $gridJs .= "mtype: 'GET',";
        $gridJs .= "jsonReader: {";
        $gridJs .= "root: 'data',";
        $gridJs .= "page: 'current_page',";
        $gridJs .= "total: 'last_page',";
        $gridJs .= "records: 'total',";
        $gridJs .= "repeatitems: false },";
        $gridJs .= 'pager: $("#'.$gridId.'_pager"),';
        $gridJs .= "viewrecords: true,";
        $gridJs .= "autowidth: true,";
        $gridJs .= "shrinkToFit: false,"; 
        $gridJs .= "forceFit: true,";  
        $gridJs .= "toolbar: [true,'top'],";
        $gridJs .= "rowNum: " . $this->rowNum . ",";
        $gridJs .= "rowList: [" . implode(",", $this->rowList)   . "],";
        
        $columnNames = array();
        $columnModels = array();
        $sortName = "";
        $sortOrder = "";
        
        foreach($columns as $column){
           
            $columnNames[] = translation($column["languageKey"], $column["name"]);
            $columnModel = "{";
            $columnModel .= "name: '" . $column["name"] . "'";
            $columnModel .= ", width: " . $column["width"];
            
            if(isset($column["align"])){
                $columnModel .= ", align:'" . $column["align"] . "'";
            }
            
            
            if(isset($column["type"]) && $column["type"] == "action"){
                $columnModel .= ", sortable: false"; 
                $columnModel .= ", fixed: true"; 
                $columnModel .= ", resize: false";  
                $columnModel .= ", search: false";   
            }else{
                if(!empty($column["order"])){
                    if(is_array($column["order"]) && !empty($column["order"]["default"])){
                        $sortName = $column['name'];
                        if(!empty($column["order"]["direction"])){
                            $sortOrder = $column["order"]["direction"];        
                        }else{
                            $sortOrder = "asc";    
                        }                
                    }  
                }else{
                    $columnModel .= ", sortable: false";    
                } 
                
                if(empty($column["search"])){
                    $columnModel .= ", search: false"; 
                }else{
                    if(is_array($column["search"])){
                        $columnSearch = $column["search"];
                        if($columnSearch["stype"] == "select"){
                            if(isset($columnSearch["list"]["table"])){
                            
                                $results = DB::table($columnSearch["list"]["table"])->select($columnSearch["list"]["field"])->get();
                                $columnModel .= ", stype: 'select', searchoptions: {value: ':" . ucfirst(translation("common.all", 'all'));
                                
                                foreach($results as $row){
                                    $columnModel .= ";{$row->$columnSearch["list"]["field"]}:{$row->$columnSearch["list"]["field"]}";    
                                }
                            }else{
                                $columnModel .= ", stype: 'select', searchoptions: {value: ':" . ucfirst(translation("common.all", 'all'));
                                foreach($columnSearch["list"] as $key => $value){
                                    $columnModel .= ";{$key}:{$value}";    
                                }    
                            }
                            
                            $columnModel .= "',separator:':',delimiter:';'}";   
                        }elseif($columnSearch["stype"] == "calendar"){
                            $columnModel .= ", sorttype:'datetime',datefmt:'Y-m-d',formatter:'date', searchoptions: {sopt:['eq','le','lt','ge','gt']";
                            $columnModel .= ", dataInit:function(el){
                                setTimeout(function(){
                                    if(jQuery.ui) { 
                                        if(jQuery.ui.datepicker){ 
                                            jQuery(el).datepicker({
                                                disabled:false,
                                                dateFormat:'yy-mm-dd'
                                                });
                                            jQuery('.ui-datepicker').css({'font-size':'75%'});
                                        } 
                                    }
                                },100);
                                }}";
                            
                            $columnModel .= ", formatoptions:{srcformat:'Y-m-d',newformat:'Y-m-d'}";
                        }elseif($columnSearch["stype"] == "calendar_time"){
                            $columnModel .= ", sorttype:'datetime',datefmt:'Y-m-d H:i:s',formatter:'date', searchoptions: {sopt:['eq','le','lt','ge','gt']";
                            $columnModel .= ", dataInit:function(el){
                                setTimeout(function(){
                                            jQuery(el).datetimepicker({
                                                disabled:false,
                                                dateFormat:'yy-mm-dd',
                                                timeFormat: 'HH:mm:ss',
                                                addSliderAccess: true,
                                                sliderAccessArgs: { touchonly: false }
                                                });
                                },100);
                                }}"; 
                            $columnModel .= ", formatoptions:{srcformat:'Y-m-d H:i:s',newformat:'Y-m-d H:i:s'}";      
                        }else{
                            $columnModel .= ", searchoptions: {sopt:['cn']}";        
                        }    
                    }else{
                        $columnModel .= ", searchoptions: {sopt:['cn']}";    
                    }
                    
                        
                }
            }
            
            $columnModel .= "}";  
            $columnModels[] = $columnModel;   
        }
        
        $gridJs .= "colNames: ['" . implode("','", $columnNames) . "'],";
        $gridJs .= "colModel: [" . implode(",", $columnModels) . "]";
        
        if(!empty($sortName)){
            $gridJs .= ",sortname: '" . $sortName . "'"; 
            $gridJs .= ",sortorder: '" . $sortOrder . "'";    
        }
        
        $gridJs .= "});";
        
        $gridJs .= '$("#'.$gridId.'").jqGrid(
            "filterToolbar",
            {
                searchOperators : true,
                defaultSearch: "cn",
                stringResult : true
            });';
        
        if(!empty($actions)){
            $actionsHtml = "";
            foreach($actions as $action){
                $actionsHtml .= "<a class='action' href='" .url($action["url"]) . "'>" . 
                    "<img src='" .  Config::get('path.backoffice.images_path') . "/" . $action["icon"] . "' />" . 
                    "<span>" . translation($action["languageKey"]) . "</span>" .
                    "</a>";    
            }
            $gridJs .= '$("#t_' . $gridId . '").append("' . $actionsHtml . '");';
        }
        
        $gridJs .= "});";

        $gridJs .= "</script>";
        return $gridJs;
    }
    
    
    public function getMetadataScript($gridId, $url, $metadata, $parentId = null, $gridParams = null){

        $columns = unserialize(serialize($metadata["grid"]["columns"]));
        $actions = null;
        $tableName = $metadata["model"]::getTableName();

        foreach($columns as &$column){
            if($column["type"] == "field"){
                if(empty($column["relation"])){
                    $column["name"] = "{$tableName}.{$column["name"]}";
                }else{
                    $relation = $column["relation"];
                    $column["name"] = "{$relation["table"]}.{$relation["field"]}";
                }
            }  
        }
        
        if(!empty($metadata["grid"]["actions"])){
            $actions = unserialize(serialize($metadata["grid"]["actions"]));
            foreach($actions as &$action){             
                $action["url"] = convertBackofficeUrl($action["url"], $metadata, null, $parentId);   
            }
        }

        return $this->getScript($gridId, $url, $columns, $actions, $gridParams);
    }
        
}
