<?php

namespace App\Entities\Presupuestos;

use App\Entities\Clientes\ClienteEntity;
use App\Entities\Configuracion\PapelFormatoEntity;
use App\Entities\Configuracion\TipoPresupuestoEntity;
use App\Models\Clientes\ClienteModel;
use App\Models\Configuracion\PapelFormatoModel;
use App\Models\Configuracion\TipoPresupuestoModel;
use App\Models\Presupuestos\PresupuestoAcabadosModel;
use App\Models\Presupuestos\PresupuestoEncuadernacionesModel;
use App\Models\Presupuestos\PresupuestoFicheroModel;
use App\Models\Presupuestos\PresupuestoLineaModel;
use App\Models\Presupuestos\PresupuestoManipuladosModel;
use App\Models\Presupuestos\PresupuestoModel;
use App\Models\Presupuestos\PresupuestoPreimpresionesModel;
use App\Models\Presupuestos\PresupuestoServiciosExtraModel;
use CodeIgniter\Entity;

class PresupuestoEntity extends \CodeIgniter\Entity\Entity
{
    protected $attributes = [
        "id" => null,
        "cliente_id" => null,
        "user_created_id" => 1,
        "user_update_id" => null,
        "tipo_impresion_id" => null,
        "tipologia_id" => null,
        "pais_id" => 1,
        "estado_id" => 1,
        "inc_rei" => null,
        "causa_cancelacion" => null,
        "retractilado" => false,
        "retractilado5" => false,
        "guardas" => false,
        "recoger_en_taller" => false,
        "ferro" => false,
        "ferro_digital" => false,
        "marcapaginas" => false,
        "prototipo" => false,
        "papel_formato_id" => null,
        "papel_formato_personalizado" => false,
        "papel_formato_ancho" => null,
        "papel_formato_alto" => null,
        "titulo" => "",
        "autor" => null,
        "coleccion" => null,
        "numero_edicion" => null,
        "isbn" => null,
        "referencia_cliente" => null,
        "paginas" => null,
        "tirada" => null,
        "solapas" => false,
        "solapas_ancho" => 0.0,
        "solapas_sobrecubierta" => false,
        "solapas_ancho_sobrecubierta" => 0.0,
        "faja_color" => false,
        "solapas_ancho_faja_color" => 0.0,
        "alto_faja_color" => 0.0,
        "cosido" => false,
        "sobrecubiertas" => false,
        "sobrecubiertas_ancho" => 0.0,
        "merma" => null,
        "merma_cubierta" => 6.0,
        "comentarios_cliente" => null,
        "comentarios_safekat" => null,
        "comentarios_pdf" => null,
        "comentarios_tarifa" => null,
        "comentarios_produccion" => null,
        "comentarios_presupuesto" => null,
        "lomo_cubierta" => null,
        "lomo_sobrecubierta" => null,
        "total_presupuesto" => null,
        "envios_recoge_cliente" => false,
        "tirada_alternativa_json_data" => null,
        "aprobado_user_id" => null,
        "aprobado_at" => null,
        "comparador_json_data" => null,
        "is_deleted" => 0,
        "deleted_at" => null,
        "created_at" => null,
        "updated_at" => null,
        "comp_tipo_impresion" => null,
        "pos_paginas_color" => null,
        "total_coste_papel" => null,
        "total_margen_papel" => null,
        "total_margenPercent_papel" => null,
        "total_coste_impresion" => null,
        "total_margen_impresion" => null,
        "total_margenPercent_impresion" => null,
        "total_coste_servicios" => null,
        "total_margen_servicios" => null,
        "total_margenPercent_servicios" => null,
        "total_coste_envios" => null,
        "total_margen_envios" => null,
        "total_costes" => null,
        "total_margenes" => null,
        "total_antes_descuento" => null,
        "total_descuento" => null,
        "total_descuentoPercent" => null,
        "total_precio_unidad" => null,
        "total_factor" => null,
        "total_factor_ponderado" => null,
        'total_aceptado' => null,
        'total_aceptado_revisado' => null,
        'iva_reducido' => null,
        'excluir_rotativa' => null,
        "acabado_cubierta_id" => null,
        "acabado_sobrecubierta_id" => null,
        "acabado_faja_id" => null,
        "is_duplicado" => false,
        'paginas_color_consecutivas' => null,
        'papel_interior_diferente' => null,
        'paginasCuadernillo' => null,
        'lomo_redondo' => null,
        'cabezada' => null,
        'envio_base' => null,
    ];
    protected $casts = [
        "cliente_id" => "int",
        "user_created_id" => "int",
        "user_update_id" => "?int",
        "tipo_impresion_id" => "?int",
        "tipologia_id" => "?int",
        "pais_id" => "int",
        "estado_id" => "int",
        "retractilado" => "boolean",
        "retractilado5" => "boolean",
        "guardas" => "boolean",
        "recoger_en_taller" => "boolean",
        "ferro" => "boolean",
        "ferro_digital" => "boolean",
        "marcapaginas" => "boolean",
        "prototipo" => "boolean",
        "papel_formato_id" => "int",
        "papel_formato_personalizado" => "boolean",
        "papel_formato_ancho" => "?float",
        "papel_formato_alto" => "?float",
        "paginas" => "int",
        "tirada" => "int",
        "solapas" => "boolean",
        "solapas_ancho" => "float",
        "solapas_sobrecubierta" => "boolean",
        "solapas_ancho_sobrecubierta" => "float",
        "faja_color" => "boolean",
        "solapas_ancho_faja_color" => "float",
        "alto_faja_color" => "float",
        "cosido" => "boolean",
        "sobrecubiertas" => "boolean",
        "sobrecubiertas_ancho" => "float",
        "merma" => "float",
        "merma_cubierta" => "float",
        "lomo_cubierta" => "?float",
        "lomo_sobrecubierta" => "?float",
        "envios_recoge_cliente" => "boolean",
        "aprobado_user_id" => "?int",
        "is_deleted" => "int",
        "total_coste_papel" => "?float",
        "total_margen_papel" => "?float",
        "total_margenPercent_papel" => "?float",
        "total_coste_impresion" => "?float",
        "total_margen_impresion" => "?float",
        "total_margenPercent_impresion" => "?float",
        "total_coste_servicios" => "?float",
        "total_margen_servicios" => "?float",
        "total_margenPercent_servicios" => "?float",
        "total_coste_envios" => "?float",
        "total_margen_envios" => "?float",
        "total_costes" => "?float",
        "total_margenes" => "?float",
        "total_antes_descuento" => "?float",
        "total_descuento" => "?float",
        "total_descuentoPercent" => "?float",
        "total_presupuesto" => "?float",
        "total_precio_unidad" => "?float",
        "total_factor" => "?float",
        "total_factor_ponderado" => "?float",
        'total_aceptado' => "?float",
        'total_aceptado_revisado' => "?float",
        'iva_reducido' => "?boolean",
        'excluir_rotativa' => "?boolean",
        "acabado_cubierta_id" => "int",
        "acabado_sobrecubierta_id" => "int",
        "acabado_faja_id" => "int",
        "is_duplicado" => "boolean",
        'paginas_color_consecutivas' => "boolean",
        'papel_interior_diferente' => "boolean",
        'paginasCuadernillo' => "int",
        'lomo_redondo' => "boolean",
    ];
    /**
     * Devuelve la entity con un campo `presupuesto_lineas` con las lineas de presupuesto asociadas
     *
     * @return this
     */
    public function withPresupuestoLineas()
    {
        $this->attributes["presupuesto_lineas"] = $this->presupuestoLineas();
        return $this;
    }
    /**
     * Obtiene las lineas de presupuesto del actual presupuesto
     *
     * @return array<PresupuestoLineaEntity>
     */
    public function presupuestoLineas(): array
    {
        $model = model(PresupuestoLineaModel::class);

        $q = $model->where('presupuesto_id', $this->attributes["id"])->findAll();

        return $q;
    }
        /**
     * Obtiene las lineas de presupuesto del actual presupuesto
     *
     * @return PresupuestoLineaEntity
     */
    public function presupuestoLineaImpresion(): PresupuestoLineaEntity
    {
        $model = model(PresupuestoLineaModel::class);

        $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_rot_bn","lp_rot_color","lp_color","lp_colorhq","lp_bn","lp_bnhq"])->first();

        return $q;
    }
            /**
     * Obtiene las lineas de presupuesto del actual presupuesto
     *
     * @return PresupuestoLineaEntity
     */
    public function presupuestoLineaCubierta(): PresupuestoLineaEntity
    {
        $model = model(PresupuestoLineaModel::class);

        $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_cubierta"])->first();

        return $q;
    }
                /**
     * Obtiene las lineas de presupuesto del actual presupuesto
     *
     * @return PresupuestoLineaEntity
     */
    public function presupuestoLineaSobreCubierta(): ?PresupuestoLineaEntity
    {
        $model = model(PresupuestoLineaModel::class);

        $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_sobrecubierta"])->first();

        return $q;
    }
    public function hasSobrecubierta() : bool
    {
        $hasSobrecubierta = false;
        $model = model(PresupuestoLineaModel::class);
        $q = $model->where('presupuesto_id', $this->attributes["id"])->whereIn("tipo",["lp_sobrecubierta"])->countAllResults();
        if($q > 0){
            $hasSobrecubierta = true;
        }
        return $hasSobrecubierta;
    }
    public function cliente() : ClienteEntity
    {
        $m = model(ClienteModel::class);
        return $m->find($this->attributes["cliente_id"]);
    }
    public function encuadernaciones(): array
    {
        $m = model(PresupuestoEncuadernacionesModel::class);
        return $m->where("presupuesto_id",$this->attributes["id"])->findAll();
    }
    public function acabados(): array
    {
        $m = model(PresupuestoAcabadosModel::class);
        return $m->where("presupuesto_id",$this->attributes["id"])->findAll();
    }
    public function preimpresiones(): array
    {
        $m = model(PresupuestoPreimpresionesModel::class);
        return $m->where("presupuesto_id",$this->attributes["id"])->findAll();
    }
    public function manipulados(): array
    {
        $m = model(PresupuestoManipuladosModel::class);
        return $m->where("presupuesto_id",$this->attributes["id"])->findAll();
    }
    public function extras(): array
    {
        $m = model(PresupuestoServiciosExtraModel::class);
        return $m->where("presupuesto_id",$this->attributes["id"])->findAll();
    }
    public function papel_formato() : PapelFormatoEntity
    {
        $m = model(PapelFormatoModel::class);
        return $m->find($this->attributes["papel_formato_id"]);
    }
    public function files(): array 
    {
        $m = model(PresupuestoFicheroModel::class);
        $files = $m->where('presupuesto_id',$this->attributes['id'])->findAll();
        return $files ?? [];
    }
    public function tipo_presupuesto() : ?TipoPresupuestoEntity
    {
        $tipo_presupuesto = null;
        $m = model(TipoPresupuestoModel::class);
        if($this->attributes["tipo_impresion_id"]){
            $tipo_presupuesto = $m->find($this->attributes['tipo_impresion_id']);
        }
        return $tipo_presupuesto;

    }

}
