<?php

namespace App\Models\Etiquetas;

use CodeIgniter\Model;
use App\Entities\Etiquetas\EtiquetaTituloLinea;

class EtiquetasTitulosLineasModel extends Model
{
    protected $table = 'etiquetas_titulos_lineas';
    protected $primaryKey = 'id';
    protected $useAutoIncrement = true;

    protected $returnType = EtiquetaTituloLinea::class;
    protected $useSoftDeletes = true;

    protected $allowedFields = [
        'etiqueta_titulos_id',
        'ot_id',
        'unidades',
        'numero_caja',
        'user_created_at',
        'user_updated_at',
        'user_deleted_at',
    ];

    protected $useTimestamps = true;
    protected $createdField = 'created_at';
    protected $updatedField = 'updated_at';
    protected $deletedField = 'deleted_at';

    protected $validationRules = [];
    protected $validationMessages = [];
    protected $skipValidation = false;

    protected $beforeDelete = ['addUserDeleted'];
    protected $beforeUpdate = ['addUserUpdated'];

    protected function addUserDeleted(array $data)
    {
        $userId = auth()->user()->id;

        if (!isset($data['data'])) {
            $data['data'] = [];
        }

        if (!empty($data['id'])) {
            $builder = $this->builder();
            $builder->whereIn($this->primaryKey, (array) $data['id'])
                ->update(['user_deleted_at' => $userId]);
        }
        return $data;
    }

    protected function addUserUpdated(array $data)
    {
        $userId = auth()->user()->id;

        if (!isset($data['data'])) {
            $data['data'] = [];
        }

        if (!empty($data['id'])) {
            $builder = $this->builder();
            $builder->whereIn($this->primaryKey, (array) $data['id'])
                ->update(['user_updated_at' => $userId]);
        }
        return $data;
    }

    public function getDatatableQuery($etiqueta_id, $direccion = null)
    {
        $direccionNormalizada = str_replace(' ', '', strtolower(trim($direccion)));

        // Subconsulta: suma de pesos por presupuesto
        $subPeso = $this->db->table('presupuesto_linea')
            ->select('presupuesto_id, ROUND(SUM(peso)/1000, 2) as pesoUnidad')
            ->groupBy('presupuesto_id');

        $builder = $this->db->table('etiquetas_titulos_lineas etl')
            ->select('
            etl.id as id,
            etl.ot_id as ot,
            pr.titulo as titulo,
            etl.unidades as unidades,
            etl.numero_caja as numero_caja,
            etl.numero_caja as numero_caja_raw,
            pd.cantidad as unidadesTotal,
            etl.id as id,
            etl.unidades as unidadesRaw,
            peso_sub.pesoUnidad
        ')
            ->join('etiquetas_titulos et', 'et.id = etl.etiqueta_titulos_id')
            ->join('ordenes_trabajo ot', 'ot.id = etl.ot_id')
            ->join('pedidos p', 'p.id = ot.pedido_id')
            ->join('pedidos_linea pl', 'pl.pedido_id = p.id')
            ->join('presupuestos pr', 'pr.id = pl.presupuesto_id')
            ->join("({$subPeso->getCompiledSelect()}) as peso_sub", 'peso_sub.presupuesto_id = pr.id', 'left')
            ->join('presupuesto_direcciones pd', 'pd.presupuesto_id = pr.id')
            ->where('etl.deleted_at IS NULL')
            ->where('et.id', $etiqueta_id)
            ->where("REPLACE(LOWER(TRIM(pd.direccion)), ' ', '') = '{$direccionNormalizada}'", null, false)
            ->orderBy('etl.numero_caja');

        return $builder;
    }

}
