<?php

namespace App\Models\OrdenTrabajo;

use App\Entities\Produccion\OrdenTrabajoEntity;
use CodeIgniter\Database\BaseBuilder;
use CodeIgniter\Model;
class OrdenTrabajoModel extends Model
{
    protected $table            = 'ordenes_trabajo';
    protected $primaryKey       = 'id';
    protected $useAutoIncrement = true;
    protected $returnType       = OrdenTrabajoEntity::class;
    protected $useSoftDeletes   = true;
    protected $protectFields    = true;
    protected $allowedFields    = [
        "pedido_id",
        "user_created_id",
        "user_updated_id",
        "fecha_entrega_warning",
        "fecha_entrega_warning_revised",
        "total_tirada",
        "total_precio",
        "tipo_entrada",
        "progreso",
        "estado",
        "comentarios",
        "revisar_formato",
        "revisar_lomo",
        "revisar_solapa",
        "revisar_isbn",
        "revisar_codigo_barras",
        "realizar_imposicion",
        "enviar_impresion",
        "portada_path",
        "is_pedido_espera",
        "pedido_espera_by"
    ];

    protected bool $allowEmptyInserts = false;
    protected bool $updateOnlyChanged = true;

    protected array $casts = [];
    protected array $castHandlers = [];

    // Dates
    protected $useTimestamps = true;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';
    protected $deletedField  = 'deleted_at';

    // Validation
    protected $validationRules      = [];
    protected $validationMessages   = [];
    protected $skipValidation       = false;
    protected $cleanValidationRules = true;

    // Callbacks
    protected $allowCallbacks = true;
    protected $beforeInsert   = [];
    protected $afterInsert    = [];
    protected $beforeUpdate   = [];
    protected $afterUpdate    = [];
    protected $beforeFind     = [];
    protected $afterFind      = [];
    protected $beforeDelete   = [];
    protected $afterDelete    = [];

    public function getDatatableQuery() : BaseBuilder
    {
        $q = $this->builder()
        ->select([
            "ordenes_trabajo.id",
            "ordenes_trabajo.pedido_id",
            "pedidos.fecha_encuadernado as fecha_encuadernado_at",
            "clientes.nombre as cliente_nombre",
            "presupuestos.titulo as presupuesto_titulo",
            "ordenes_trabajo.estado",
            "ubicaciones.nombre as ubicacion_nombre",
            "pedidos.total_tirada",
            "tipos_presupuestos.codigo as tipo_presupuesto_impresion",
            "ordenes_trabajo.progreso",
            "presupuesto_linea.tipo as presupuesto_linea_tipo",
            "orden_trabajo_dates.ferro_ok_at",
            "CONCAT(lg_imposiciones.ancho,'x',lg_imposiciones.alto,'_',COALESCE(lg_imposiciones.unidades,'NULL'),'_',COALESCE(lg_imposiciones.orientacion,'NULL')) as imposicion_name"

        ])
        ->join("orden_trabajo_dates","orden_trabajo_dates.orden_trabajo_id  = ordenes_trabajo.id","left")
        ->join("pedidos","pedidos.id = ordenes_trabajo.pedido_id","left")
        ->join("pedidos_linea","pedidos.id = pedidos_linea.pedido_id","left")
        ->join("presupuestos","presupuestos.id = pedidos_linea.presupuesto_id","left")
        ->join("presupuesto_linea","presupuestos.id = presupuesto_linea.presupuesto_id","left")
        ->join("clientes","clientes.id = presupuestos.cliente_id","left")
        ->join("tipos_presupuestos","presupuestos.tipo_impresion_id = tipos_presupuestos.id","left")
        ->join("ubicaciones","ubicaciones.id = pedidos_linea.ubicacion_id","left")
        ->join("orden_trabajo_tareas","orden_trabajo_tareas.orden_trabajo_id = ordenes_trabajo.id","left")
        ->join("lg_imposiciones","lg_imposiciones.id = orden_trabajo_tareas.imposicion_id","left")

        ->whereIn("presupuesto_linea.tipo",["lp_bn","lp_bnhq","lp_rot_bn","lp_color","lp_colorhq","lp_rot_color"])
        ->where("ordenes_trabajo.deleted_at",null)
        ->groupBy("ordenes_trabajo.id");
        return $q;
    }

    public function updateMaquinas(OrdenTrabajoEntity $ot)
    {

    }
}
