<?php

namespace App\Models\Clientes;

class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
{
    protected $table = "cliente_plantilla_precios_lineas";

    const SORTABLE = [
        0 => "t1.id",
        1 => "t1.tipo",
        2 => "t1.tipo_maquina",
        3 => "t1.tipo_impresion",
        4 => "t1.tiempo_min",
        5 => "t1.tiempo_max",
        6 => "t1.precio_hora",
        7 => "t1.margen",
        8 => "CONCAT(t2.first_name, ' ', t2.last_name)",
        9 => "t1.updated_at",
    ];

    /**
     * Whether primary key uses auto increment.
     *
     * @var bool
     */
    protected $useAutoIncrement = true;


    protected $allowedFields = [
        "plantilla_id", 
        "tipo", 
        "tipo_maquina", 
        "tipo_impresion", 
        "tiempo_min", 
        "tiempo_max", 
        "precio_hora", 
        "margen", 
        "deleted_at", 
        "created_at", 
        "updated_at",
        "user_updated_id"];

    protected $returnType = "App\Entities\Clientes\ClientePlantillaPreciosLineasEntity";

    protected $useTimestamps = true;
    protected $useSoftDeletes = true;

    protected $createdField = "created_at";

    protected $updatedField = "updated_at";
    protected $deletedField = 'deleted_at';

    public static $labelField = "plantilla_id";

    protected $validationRules = [
        "plantilla_id" => [
            "label" => "ClientePrecios.plantilla_id",
            "rules" => "required",
        ],
        "tipo" => [
            "label" => "ClientePrecios.tipo",
            "rules" => "required|in_list[interior,cubierta,sobrecubierta]",
        ],
        "tipo_maquina" => [
            "label" => "ClientePrecios.tipo_maquina",
            "rules" => "required|in_list[toner,inkjet]",
        ],
        "tipo_impresion" => [
            "label" => "ClientePrecios.tipo_impresion",
            "rules" => "required|in_list[negro,color,negrohq,colorhq]",
        ],
        "tiempo_min" => [
            "label" => "ClientePrecios.tiempo_min",
            "rules" => "required|decimal",
        ],
        "tiempo_max" => [
            "label" => "ClientePrecios.tiempo_max",
            "rules" => "required|decimal",
        ],
        "margen" => [
            "label" => "ClientePrecios.margen",
            "rules" => "required|decimal",
        ],

        
        
    ];

    protected $validationMessages = [
        "plantilla_id" => [
            "required" => "ClientePrecios.validation.required",
            
        ],
        "tipo" => [
            "required" => "ClientePrecios.validation.required",
        ],
        "tipo_maquina" => [
            "required" => "ClientePrecios.validation.required",
        ],
        "tipo_impresion" => [
            "required" => "ClientePrecios.validation.required",
        ],
        "tiempo_min" => [
            "required" => "ClientePrecios.validation.required",
        ],
        "tiempo_max" => [
            "required" => "ClientePrecios.validation.required",
        ],
        "margen" => [
            "required" => "ClientePrecios.validation.required",
        ],
    ];



    function delete_values($plantilla_id = 0){
        $datetime = (new \CodeIgniter\I18n\Time("now"));
        $date_value = $datetime->format('Y-m-d H:i:s');

        $this->db
            ->table($this->table . " t1")
            ->where('t1.plantilla_id', $plantilla_id)
            ->set('deleted_at', $date_value)
            ->update();

        $this->db
            ->table('cliente_precios' . " t1")
            ->where('t1.plantilla_id', $plantilla_id)
            ->set('plantilla_id', null)
            ->update();
    }

         /**
     * Get resource data.
     *
     * @param string $search
     *
     * @return \CodeIgniter\Database\BaseBuilder
     */
    public function getResource($search = [], $plantilla_id = -1)
    {
        $builder = $this->db
            ->table($this->table . " t1")
            ->select(
                "t1.id as id, t1.tipo AS tipo, t1.tipo_maquina AS tipo_maquina, t1.tipo_impresion AS tipo_impresion,
                t1.tiempo_min AS tiempo_min, t1.tiempo_max AS tiempo_max, t1.precio_hora AS precio_hora, t1.margen AS margen,
                t1.user_updated_id AS user_updated_id, t1.updated_at AS updated_at, CONCAT(t2.first_name, ' ', t2.last_name) AS user_updated,
                t1.id AS DT_RowId, t1.precio_hora*(1+t1.margen/100.0) as total_precio_hora"
            );

        $builder->join("users t2", "t1.user_updated_id = t2.id", "left");
        
        $builder->where('t1.deleted_at', null);
        $builder->where('t1.plantilla_id', $plantilla_id);
        
        if (empty($search))
            return $builder;
        else {
            $builder->groupStart();
            foreach ($search as $col_search) {
                    if ($col_search[0] > 0 && $col_search[0] < 4)
                        $builder->where(self::SORTABLE[$col_search[0]], $col_search[2]);
                    else
                        $builder->like(self::SORTABLE[$col_search[0]], $col_search[2]);
            }
            $builder->groupEnd();
            return $builder;
        }
    }

    public function checkIntervals($data = [], $id_linea = null, $plantilla_id = null){
        
        helper('general');

        if(floatval($data["tiempo_min"])>= floatval($data["tiempo_max"])){
            return lang('ClientePrecios.errors.error_tiempo_range');
        }

        $rows = $this->db
            ->table($this->table)
            ->select("id, tiempo_min, tiempo_max")
            ->where("deleted_at", null)
            ->where("tipo", $data["tipo"])
            ->where("tipo_maquina", $data["tipo_maquina"])
            ->where("tipo_impresion", $data["tipo_impresion"])
            ->where("plantilla_id", $plantilla_id)
            ->get()->getResultObject();


        foreach ($rows as $row) {
            if (!is_null($id_linea)){
                if($row->id == $id_linea){
                    continue;
                }
            }
            if(check_overlap(floatval($data["tiempo_min"]), floatval($data["tiempo_max"]),
                                $row->tiempo_min, $row->tiempo_max)){
                    return lang('ClientePrecios.errors.error_tiempo_overlap');
            }
        }

        return "";
    }


    function copy_from_cliente($cliente_id = 0, $plantilla_id = 0){
        
        $datetime = (new \CodeIgniter\I18n\Time("now"));
        $date_value = $datetime->format('Y-m-d H:i:s');
            
        
        // Se cargan los valores en la plantilla
        $clientePreciosModel = model('App\Models\Clientes\ClientePreciosModel');
        $values = $clientePreciosModel->getResource([], $cliente_id)->get()->getResultObject();
        foreach ($values as $value) {
            $this->db
                ->table($this->table . " t1")
                ->set('plantilla_id', $plantilla_id)
                ->set('tipo', $value->tipo)
                ->set('tipo_maquina', $value->tipo_maquina)
                ->set('tipo_impresion', $value->tipo_impresion)
                ->set('tiempo_min', $value->tiempo_min)
                ->set('tiempo_max', $value->tiempo_max)
                ->set('margen', $value->margen)
                ->set('user_updated_id', auth()->user()->id)
                ->set('updated_at', $date_value)
                ->insert();
        }

    }    

}
