<?php

namespace App\Models\Presupuestos;

use App\Models\Configuracion\TipoPresupuestoModel;


class PresupuestoModel extends \App\Models\BaseModel
{
    protected $table = "presupuestos";

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

    const SORTABLE = [
        0 => "t1.id",
        1 => "t1.created_at",
        2 => "t2.nombre",
        3 => "t3.first_name",
        4 => "t1.titulo",
        5 => "t5.nombre",
        6 => "t1.inc_rei",
        7 => "t1.paginas",
        8 => "t1.tirada",
        9 => "t1.total_presupuesto",
        10 => "t6.estado",
    ];

    const SORTABLE_CLIENTE = [
        0 => "t1.id",
        1 => "t1.updated_at",
        2 => "t7.codigo",
        4 => "t1.titulo",
        5 => "t1.paginas",
        6 => "t1.tirada",
        7 => "t1.total_presupuesto",
        8 => "t6.id",
    ];

    protected $allowedFields = [
        "cliente_id",
        "user_created_id",
        "user_update_id",
        "tipo_impresion_id",
        "tipologia_id",
        "pais_id",
        "estado_id",
        "inc_rei",
        "causa_cancelacion",
        "retractilado",
        "retractilado5",
        "guardas",
        "recoger_en_taller",
        "ferro",
        "ferro_digital",
        "marcapaginas",
        "prototipo",
        "papel_formato_id",
        "papel_formato_personalizado",
        "papel_formato_ancho",
        "papel_formato_alto",
        "titulo",
        "autor",
        "coleccion",
        "numero_edicion",
        "isbn",
        "referencia_cliente",
        "paginas",
        "tirada",
        "solapas",
        "solapas_ancho",
        "solapas_sobrecubierta",
        "solapas_ancho_sobrecubierta",
        "solapas_ancho_faja_color",
        "faja_color",
        "alto_faja_color",
        "cosido",
        "sobrecubiertas",
        "sobrecubiertas_ancho",
        "merma",
        "merma_cubierta",
        "comentarios_cliente",
        "comentarios_safekat",
        "comentarios_pdf",
        "comentarios_tarifa",
        "comentarios_presupuesto",
        "comentarios_produccion",
        "lomo_cubierta",
        "lomo_sobrecubierta",
        "total_presupuesto",
        "envios_recoge_cliente",
        "tirada_alternativa_json_data",
        "aprobado_user_id",
        "aprobado_at",
        "comparador_json_data",
        "is_deleted",
        "comp_tipo_impresion",
        "pos_paginas_color",
        "paginas_color_consecutivas",
        "papel_interior_diferente",
        "total_coste_papel",
        "total_margen_papel",
        "total_margenPercent_papel",
        "total_coste_impresion",
        "total_margen_impresion",
        "total_margenPercent_impresion",
        "total_coste_servicios",
        "total_margen_servicios",
        "total_margenPercent_servicios",
        "total_coste_envios",
        "total_margen_envios",
        "total_costes",
        "total_margenes",
        "total_antes_descuento",
        "total_descuento",
        "total_descuentoPercent",
        "total_presupuesto",
        "total_aceptado_revisado",
        "total_precio_unidad",
        "total_factor",
        "total_factor_ponderado",
        'total_aceptado',
        'iva_reducido',
        'excluir_rotativa',
        "acabado_cubierta_id",
        "barniz_cubierta_id",
        "estampado_cubierta_id",
        "acabado_sobrecubierta_id",
        "acabado_faja_id",
        "is_duplicado",
        'paginas_color_consecutivas',
        'papel_interior_diferente',
        'paginasCuadernillo',
        'lomo_redondo',
        'cabezada',
        'envio_base',
    ];
    protected $returnType = "App\Entities\Presupuestos\PresupuestoEntity";

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

    protected $createdField = "created_at";

    protected $updatedField = "updated_at";

    public static $labelField = "titulo";

    protected $validationRulesAdd = [
        "autor" => [
            "label" => "Presupuestos.autor",
            "rules" => "trim|max_length[150]",
        ],
        "titulo" => [
            "label" => "Presupuestos.titulo",
            "rules" => "trim|required|max_length[300]",
        ],
        "inc_rei" => [
            "label" => "Presupuestos.incRei",
            "rules" => "integer|permit_empty",
        ],
        "coleccion" => [
            "label" => "Presupuestos.incRei",
            "rules" => "trim|max_length[255]",
        ],
        "numero_edicion" => [
            "label" => "Presupuestos.numeroEdicion",
            "rules" => "trim|max_length[50]",
        ],
        "isbn" => [
            "label" => "Presupuestos.isbn",
            "rules" => "trim|max_length[50]",
        ],
        "pais_id" => [
            "label" => "Presupuestos.paisId",
            "rules" => "integer",
        ],
        "cliente_id" => [
            "label" => "Presupuestos.clienteId",
            "rules" => "required|integer|greater_than[0]",
        ],
        "referencia_cliente" => [
            "label" => "Presupuestos.referenciaCliente",
            "rules" => "trim|max_length[100]",
        ],
    ];

    protected $validationMessagesAdd = [
        "autor" => [
            "max_length" => "Presupuestos.validation.max_length",
            "required" => "Presupuestos.validation.requerido",
        ],
        "titulo" => [
            "max_length" => "Presupuestos.validation.max_length",
            "required" => "Presupuestos.validation.requerido",
        ],
        "inc_rei" => [
            "integer" => "Presupuestos.validation.integer",

        ],
        "coleccion" => [
            "max_length" => "Presupuestos.validation.max_length",
        ],
        "numero_edicion" => [
            "max_length" => "Presupuestos.validation.max_length",
        ],
        "isbn" => [
            "max_length" => "Presupuestos.validation.max_length",
        ],
        "pais_id" => [
            "required" => "Presupuestos.validation.requerido",
        ],
        "cliente_id" => [
            "required" => "Presupuestos.validation.requerido",
        ],
        "referencia_cliente" => [
            "max_length" => "Presupuestos.validation.max_length",
        ],
    ];

    public function findAllWithAllRelations(string $selcols = "*", int $limit = null, int $offset = 0)
    {
        $sql =
            "SELECT t1." .
            $selcols .
            ",  t2.nombre AS cliente,  t3.nombre AS forma_pago,  t4.nombre AS tipo_impresion,  t5.nombre AS tipologia,  t6.nombre AS pais,  t7.estado AS estado,  t8.id AS papel_formato,  t9.first_name AS total_confirmado_user,  t10.first_name AS aprobado_user FROM " .
            $this->table .
            " t1 LEFT JOIN clientes
            t2 ON t1.cliente_id = t2.id LEFT JOIN formas_pago
            t3 ON t1.forma_pago_id = t3.id LEFT JOIN lg_tipos_impresion
            t4 ON t1.tipo_impresion_id = t4.id LEFT JOIN lg_tipologias_libros
            t5 ON t1.tipologia_id = t5.id LEFT JOIN lg_paises
            t6 ON t1.pais_id = t6.id = t7.id LEFT JOIN presupuesto_estados
            t7 ON t1.estado_id = t8.id LEFT JOIN lg_papel_formato
            t8 ON t1.papel_formato_id = t9.id LEFT JOIN lg_papel_generico
            t9 ON t1.total_confirmado_user_id = t26.id LEFT JOIN users
            t10 ON t1.aprobado_user_id = t27.id LEFT JOIN users";

        if (!is_null($limit) && intval($limit) > 0) {
            $sql .= " LIMIT " . intval($limit);
        }

        if (!is_null($offset) && intval($offset) > 0) {
            $sql .= " OFFSET " . intval($offset);
        }

        $query = $this->db->query($sql);
        $result = $query->getResultObject();
        return $result;
    }

    /**
     * Get resource data.
     *
     * @param string $search
     *
     * @return \CodeIgniter\Database\BaseBuilder
     */
    public function getResource($search = [], $tipo_impresion_id = 4)
    {
        $builder = $this->db
            ->table($this->table . " t1")
            ->select(
                "t1.id AS id, t1.created_at AS fecha, t2.nombre AS cliente,
                CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t1.titulo AS titulo,
                t5.nombre AS pais, t1.inc_rei AS inc_rei, t1.paginas AS paginas, t1.tirada AS tirada,
                t1.total_presupuesto AS total_presupuesto, t1.total_presupuesto AS total_presupuesto, t6.estado AS estado"
            );
        $builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
        $builder->join("users t3", "t1.user_update_id = t3.id", "left");
        $builder->join("lg_paises t5", "t1.pais_id = t5.id", "left");
        $builder->join("presupuesto_estados t6", "t1.estado_id = t6.id", "left");

        $builder->where("t1.is_deleted", 0);
        $builder->where("t1.tipo_impresion_id", $tipo_impresion_id);

        if (empty($search))
            return $builder;
        else {
            $builder->groupStart();
            foreach ($search as $col_search) {
                if ($col_search[0] != 1)
                    $builder->like(self::SORTABLE[$col_search[0]], $col_search[2]);
                else {
                    $dates = explode(" ", $col_search[2]);
                    $builder->where(self::SORTABLE[$col_search[0]] . ">=", $dates[0]);
                    $builder->where(self::SORTABLE[$col_search[0]] . "<=", $dates[1]);
                }
            }
            $builder->groupEnd();
            return $builder;
        }
    }

    public function removeIsDuplicado($presupuesto_id)
    {
        $this->db
            ->table($this->table . " t1")
            ->where('id', $presupuesto_id)
            ->set('is_duplicado', false)
            ->update();
    }

    /**
     * Get resource data for creating PDFs.
     *
     * @param string $search
     *
     * @return \CodeIgniter\Database\BaseBuilder
     */
    public function getResourceForPdf($presupuesto_id = -1)
    {
        $builder = $this->db
            ->table($this->table . " t1")
            ->select(
                "t1.id AS id, t1.created_at AS fecha, t1.titulo AS titulo, t1.autor AS autor, t1.ferro AS ferro,
                t1.ferro_digital AS ferro_digital, t1.prototipo AS prototipo, t1.solapas AS solapas, t1.solapas_sobrecubierta AS solapas_sobrecubierta,
                t1.lomo_cubierta AS lomo_cubierta, t1.lomo_sobrecubierta AS lomo_sobrecubierta,
                t1.solapas_ancho AS solapas_ancho, t1.solapas_ancho_sobrecubierta AS solapas_sobrecubierta_ancho, t1.paginas AS paginas, t1.tirada AS tirada, t1.coleccion AS coleccion,
                t1.retractilado AS retractilado, t1.guardas AS guardas, t1.marcapaginas AS marcapaginas,
                t1.comentarios_pdf AS comentarios_pdf, t1.tirada_alternativa_json_data AS tiradas_alternativas,
                t1.total_presupuesto AS total_presupuesto, t1.total_precio_unidad AS total_precio_unidad,
                t1.papel_formato_personalizado AS isPersonalizado, t1.envios_recoge_cliente AS recoge_cliente,
                t1.solapas_ancho_faja_color AS ancho_solapas_faja,
                CONCAT(t1.papel_formato_ancho, 'x', t1.papel_formato_alto) AS formatoPersonalizado,
                t2.nombre AS cliente,
                CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t5.secret AS email_comercial,
                CONCAT(t4.ancho, 'x', t4.alto) AS formato, t6.encuadernacion AS tipo_encuadernado,
                t1.comp_tipo_impresion AS tipo_impresion"
            );
        $builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
        $builder->join("users t3", "t1.user_update_id = t3.id", "left");
        $builder->join("lg_papel_formato t4", "t1.papel_formato_id = t4.id", "left");
        $builder->join("auth_identities t5", "t1.user_update_id = t5.id", "left");
        $builder->join("tipos_presupuestos t6", "t1.tipo_impresion_id = t6.id", "left");

        $builder->where("t1.is_deleted", 0);
        $builder->where("t1.id", $presupuesto_id);

        return $builder;
    }

    function getListaPresupuestosCliente($search = [], $clienteId)
    {

        $builder = $this->db
            ->table($this->table . " t1")
            ->select(
                "t1.id AS id, t1.created_at AS fecha, t7.codigo as codigo, t2.nombre AS cliente,
                CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t1.titulo AS titulo,
                t5.nombre AS pais, t1.inc_rei AS inc_rei, t1.paginas AS paginas, t1.tirada AS tirada,
                t1.total_presupuesto AS total_presupuesto, t1.total_presupuesto AS total_presupuesto,
                t6.estado AS estado"
            );
        $builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
        $builder->join("users t3", "t1.user_update_id = t3.id", "left");
        $builder->join("lg_paises t5", "t1.pais_id = t5.id", "left");
        $builder->join("presupuesto_estados t6", "t1.estado_id = t6.id", "left");
        $builder->join("tipos_presupuestos t7", "t1.tipo_impresion_id = t7.id", "left");

        if ($clienteId != 0)
            $builder->where("t1.cliente_id", $clienteId);

        $builder->where("t1.is_deleted", 0);

        if (empty($search))
            return $builder;
        else {
            $builder->groupStart();
            foreach ($search as $col_search) {
                if ($col_search[0] != 1)
                    $builder->like(self::SORTABLE_CLIENTE[$col_search[0]], $col_search[2]);
                else {
                    $dates = explode(" ", $col_search[2]);
                    $builder->where(self::SORTABLE_CLIENTE[$col_search[0]] . ">=", $dates[0]);
                    $builder->where(self::SORTABLE_CLIENTE[$col_search[0]] . "<=", $dates[1]);
                }
            }
            $builder->groupEnd();
            return $builder;
        }
    }

    function confirmarPresupuesto($presupuesto_id)
    {
        $this->db
            ->table($this->table . " t1")
            ->where('t1.id', $presupuesto_id)
            ->set('t1.estado_id', 2)
            ->update();
    }

    function insertarPresupuestoCliente($id, $tirada, $data, $data_cabecera, $extra_info, $resumen_totales, $iva_reducido, $excluir_rotativa, $tiradas_alternativas)
    {

        helper('date');

        $model = model('App\Models\Configuracion\PapelFormatoModel');
        $papel_formato_id = $model->where('ancho', $data['tamanio']['ancho'])->where('alto', $data['tamanio']['alto'])->first();

        $is_cosido = (new TipoPresupuestoModel())->get_isCosido($data['tipo_impresion_id']);

        $totalCostes = $resumen_totales['totalPapel'] + $resumen_totales['totalImpresion'] +
            $resumen_totales['totalServicios']; //+ $resumen_totales['envio_base_coste'];
        $totalMargenes = $resumen_totales['margenPapel'] + $resumen_totales['margenImpresion'] +
            $resumen_totales['margenServicios']; //+ $resumen_totales['envio_base_margen'];

        $fields = [
            'cliente_id' => $data['clienteId'],
            'tipo_impresion_id' => $data['tipo_impresion_id'],
            'pais_id' => 1,
            'retractilado' => $data['retractilado'] ? 1 : 0,
            'retractilado5' => $data['retractilado5'] ? 1 : 0,
            'ferro' => $data['ferro'] ? 1 : 0,
            'ferro_digital' => $data['ferro_digital'] ? 1 : 0,
            'marcapaginas' => $data['marcapaginas'] ? 1 : 0,
            'prototipo' => $data['prototipo'] ? 1 : 0,
            'envio_base' => $data['envio_base'],
            'papel_formato_id' => is_null($papel_formato_id) ? 0 : $papel_formato_id->id,
            'papel_formato_personalizado' => !$papel_formato_id ? 1 : 0,
            'papel_formato_ancho' => !$papel_formato_id ? $data['tamanio']['ancho'] : null,
            'papel_formato_alto' => !$papel_formato_id ? $data['tamanio']['alto'] : null,
            'titulo' => $data_cabecera['titulo'],
            'autor' => $data_cabecera['autor'],
            'ISBN' => $data_cabecera['isbn'],
            'coleccion' => $data_cabecera['coleccion'],
            'referencia_cliente' => $data_cabecera['referenciaCliente'],
            'paginas' => $data['interior']['paginas'],
            'tirada' => $tirada,
            'solapas' => $data['cubierta']['solapasCubierta'] == 0 ? 0 : 1,
            'lomo_redondo' => $data['cubierta']['lomoRedondo'] == 0 ? 0 : 1,
            'cabezada' => $data['cubierta']['cabezada'] == 0 ? 0 : 1,
            'solapas_ancho' => $data['cubierta']['solapasCubierta'] > 0 ? $data['cubierta']['solapasCubierta'] : 0,
            'solapas_sobrecubierta' => !$data['sobrecubierta'] ? 0 : 1,
            'solapas_ancho_sobrecubierta' => !$data['sobrecubierta'] ? 0 : $data['sobrecubierta']['solapas'],
            'cosido' => $is_cosido,
            'merma' => $extra_info['merma'],
            'merma_cubierta' => $extra_info['merma'],
            'paginasCuadernillo' => $data['paginasCuadernillo'],

            'recoger_en_taller' => $data['entrega_taller'],

            'comp_pos_paginas_color' => $data['interior']['pos_paginas_color'],
            'paginas_color_consecutivas' => $data['interior']['paginas_color_consecutivas'],
            'papel_interior_diferente' => $data['interior']['papelInteriorDiferente'],

            'lomo_cubierta' => $extra_info['lomo_cubierta'],
            'lomo_sobrecubierta' => $extra_info['lomo_sobrecubierta'],

            'comparador_json_data' => $this->generateJson($data),

            'faja_color' => is_array($data['faja']) ? 1 : 0,
            'solapas_ancho_faja_color' => is_array($data['faja']) && $data['faja'] !== [] ? $data['faja']['solapas'] : 60,
            'alto_faja_color' => is_array($data['faja'])  && $data['faja'] !== [] ? $data['faja']['alto'] : 50,

            'acabado_cubierta_id' => $data['cubierta']['acabado'],
            'acabado_sobrecubierta_id' => !$data['sobrecubierta'] ? 0 : $data['sobrecubierta']['acabado'],
            'acabado_faja_id' => is_array($data['faja']) && $data['faja'] !== []  ? $data['faja']['acabado'] : 0,

            'comp_tipo_impresion' => $data['isHq'] ? ($data['isColor'] ? 'colorhq' : 'negrohq') : ($data['isColor'] ? 'color' : 'negro'),

            'user_created_id' => $extra_info['user_id'],
            'created_at' => date('Y-m-d H:i:s', now()),
            'updated_at' => date('Y-m-d H:i:s', now()),

            'tirada_alternativa_json_data' => json_encode($tiradas_alternativas),

            'total_coste_papel' => round($resumen_totales['totalPapel'], 2),
            'total_margen_papel' => round($resumen_totales['margenPapel'], 2),
            'total_margenPercent_papel' => round($resumen_totales['porcentajeMargenPapel'], 0),
            'total_coste_impresion' => round($resumen_totales['totalImpresion'], 2),
            'total_margen_impresion' => round($resumen_totales['margenImpresion'], 2),
            'total_margenPercent_impresion' => round($resumen_totales['porcentajeMargenImpresion'], 0),
            'total_coste_servicios' => round($resumen_totales['totalServicios'], 2),
            'total_margen_servicios' => round($resumen_totales['margenServicios'], 2),
            'total_margenPercent_servicios' => round($resumen_totales['porcentajeMargenServicios'], 2),
            'total_coste_envios' => round($resumen_totales['coste_envio'], 2),
            'total_margen_envios' => round($resumen_totales['margen_envio'], 2),
            'total_costes' => round($totalCostes, 2),
            'total_margenes' => round($totalMargenes, 2),

            'total_antes_descuento' => round(
                $totalCostes + $totalMargenes + 
                $resumen_totales['coste_envio']+$resumen_totales['margen_envio'] + 
                $data['envio_base'], 2),
            'total_descuento' => 0,
            'total_descuentoPercent' => 0,

            'total_precio_unidad' => $resumen_totales['precio_unidad'],
            'total_presupuesto' => round(
                $totalCostes + $totalMargenes + 
                $resumen_totales['coste_envio']+$resumen_totales['margen_envio'] + 
                $data['envio_base'], 2),
            'total_aceptado' => round($totalCostes + $totalMargenes + $resumen_totales['coste_envio']+$resumen_totales['margen_envio'], 2),

            'total_factor' => round(
                ($totalCostes + $totalMargenes ) / 
                $resumen_totales['sumForFactor'], 2),
            'total_factor_ponderado' => round(
                ($totalCostes + $totalMargenes ) / 
                $resumen_totales['sumForFactorPonderado'], 2),

            'iva_reducido' => $iva_reducido,
            'excluir_rotativa' => $excluir_rotativa,

        ];
        if ($id != 0) {
            $fields['id'] = $id;
            $fields['updated_at'] = date('Y-m-d H:i:s', now());
        }

        if ($id != 0) {
            $this->db->table($this->table)->where('id', $id)->update($fields);
            return $id;
        } else {
            $this->db->table($this->table)->insert($fields);
            return $this->db->insertID();
        }
    }

    private function generateJson($data)
    {
        $values = array();
        if (is_array($data)) {
            // -- INTERIOR --
            // Si hay negro
            if (intval($data['interior']['paginas']) > intval($data['interior']['paginas_color'])) {

                if ($data['isHq'])
                    $key = 'bnhq';
                else
                    $key = 'bn';
                if (array_key_exists('id', $data['interior']['papel_generico'])) {
                    $papel_id = intval($data['interior']['papel_generico']['id']);
                    $gramaje = intval($data['interior']['gramaje']);
                } else {
                    $papel_id = intval($data['interior']['papel_generico']['negro']['id']);
                    $gramaje = intval($data['interior']['gramaje']['negro']);
                }


                $values[$key] = array(
                    'paginas' => intval($data['interior']['paginas']) - intval(intval($data['interior']['paginas_color'])),
                    'papel_id' => $papel_id,
                    'gramaje' => $gramaje,
                );
            }
            // Si hay color
            if (intval($data['interior']['paginas_color']) > 0) {

                if ($data['isHq'])
                    $key = 'colorhq';
                else
                    $key = 'color';
                if (array_key_exists('id', $data['interior']['papel_generico'])) {
                    $papel_id = intval($data['interior']['papel_generico']['id']);
                    $gramaje = intval($data['interior']['gramaje']);
                } else {
                    $papel_id = intval($data['interior']['papel_generico']['color']['id']);
                    $gramaje = intval($data['interior']['gramaje']['color']);
                }
                $values[$key] = array(
                    'paginas' => intval(intval($data['interior']['paginas_color'])),
                    'papel_id' => $papel_id,
                    'gramaje' => $gramaje,
                );
            }

            // -- CUBIERTA --
            $values['cubierta'] = array(
                'papel_id' => intval($data['cubierta']['papel_generico_cubierta']['id']),
                'gramaje' => intval($data['cubierta']['gramajeCubierta']),
                'paginas' => intval($data['cubierta']['carasCubierta']),
            );

            // -- SOBRECUBIERTA --
            if ($data['sobrecubierta']) {
                $values['sobrecubierta'] = array(
                    'papel_id' => intval($data['sobrecubierta']['papel']['id']),
                    'gramaje' => intval($data['sobrecubierta']['gramaje']),
                    'imprimir' => 1,
                );
            }

            // -- GUARDAS --
            if ($data['datos_guardas'] != 0) {
                $values['guardas'] = array(
                    'papel_id' => intval($data['datos_guardas']['papel']['id']),
                    'gramaje' => intval($data['datos_guardas']['gramaje']),
                    'paginas' => intval($data['datos_guardas']['caras']),
                );
            }

            // -- Faja --
            if ($data['faja'] != 0 && $data['faja'] !== []) {
                $values['faja'] = array(
                    'papel_id' => intval($data['faja']['papel']),
                    'gramaje' => intval($data['faja']['gramaje']),
                );
            }

        }
        $json = json_encode($values);
        return $json;
    }

    public function generarLineaPedido($presupuesto_id, $forFactura = false, $pedido_id = 0)
    {
        $builder = $this->db
            ->table($this->table . " t1")
            ->select(
            "t1.id AS numero, t1.tipo_impresion_id as tipo, t1.tirada AS unidades, t1.total_aceptado as total, t1.paginas AS paginas,
                t1.titulo AS titulo, t1.autor AS autor, t1.isbn AS isbn,
                t1.papel_formato_id AS papel_formato_id, t1.papel_formato_personalizado AS papel_formato_personalizado,
                t1.papel_formato_ancho AS papel_formato_ancho, t1.papel_formato_alto AS papel_formato_alto,
                CONCAT(CAST(t2.ancho AS INT), 'x', CAST(t2.alto AS INT)) AS tamanio,
                t3.codigo AS codigo_encuadernacion,
                t1.solapas AS solapas_cubierta, CAST(t1.solapas_ancho AS INT) AS solapas_ancho_cubierta,
                t1.solapas_sobrecubierta AS solapas_sobrecubierta, CAST(t1.solapas_ancho_sobrecubierta AS INT) AS solapas_ancho_sobrecubierta,"
        );
        $builder->join("lg_papel_formato t2", "t1.papel_formato_id = t2.id", "left");
        $builder->join("tipos_presupuestos t3", "t1.tipo_impresion_id = t3.id", "left");
        $builder->where("t1.is_deleted", 0);
        $builder->where("t1.id", $presupuesto_id);
        $presupuesto = $builder->get()->getResultObject();
        if (count($presupuesto) > 0) {

            $modelLinea = model('App\Models\Presupuestos\PresupuestoLineaModel');
            $lineas = $modelLinea->where('presupuesto_id', $presupuesto_id)->findAll();

            $presupuesto = $presupuesto[0];

            // Libro
            if ($presupuesto->tipo < 10 || $presupuesto->tipo == 20 || $presupuesto->tipo == 21) {
                if ($presupuesto->papel_formato_personalizado == 1) {
                    $presupuesto->tamanio = $presupuesto->papel_formato_ancho . "x" . $presupuesto->papel_formato_alto;
                }

                if ($forFactura) {
                    $presupuesto->concepto = sprintf(lang('Pedidos.lineasTemplates.pedido'), $pedido_id);
                } else {
                    $presupuesto->concepto = sprintf(lang('Pedidos.lineasTemplates.presupuesto'), $presupuesto->numero);
                }
                $presupuesto->concepto .= sprintf(
                    lang('Pedidos.lineasTemplates.libro'),
                    $presupuesto->unidades,
                    $presupuesto->paginas,
                    $presupuesto->titulo,
                    $presupuesto->autor,
                    $presupuesto->isbn,
                    $presupuesto->tamanio
                );
                $presupuesto->concepto .= $this->generarConceptoLineasPresupuestoLibro($lineas, $presupuesto);

                $presupuesto = (object) [
                    'numero' => $presupuesto->numero,
                    'unidades' => $presupuesto->unidades,
                    'total' => $presupuesto->total,
                    'concepto' => $presupuesto->concepto,
                ];
            }
            return [$presupuesto];
        }
    }
    public function getServiciosPresupuesto($presupuesto_id)
    {
        $queryAcabado = $this->db->table($this->table)
            ->select(
                [
                    'lg_tarifa_acabado.id',
                    'lg_tarifa_acabado.nombre',


                ]
            )
            ->join('presupuesto_acabados', 'presupuesto_acabados.presupuesto_id = presupuestos.id', 'left')
            ->join('lg_tarifa_acabado', 'lg_tarifa_acabado.id = presupuesto_acabados.tarifa_acabado_id', 'left')
            ->where('presupuestos.id', $presupuesto_id);

        $queryPreimpresion = $this->db->table($this->table)
            ->select(
                [
                    'lg_tarifa_preimpresion.id',
                    'lg_tarifa_preimpresion.nombre',
                    'lg_tarifa_preimpresion.precio',

                ]
            )
            ->join('presupuesto_preimpresiones', 'presupuesto_preimpresiones.presupuesto_id = presupuestos.id', 'left')
            ->join('lg_tarifa_preimpresion', 'lg_tarifa_preimpresion.id = presupuesto_preimpresiones.tarifa_preimpresion_id', 'left')
            ->where('presupuestos.id', $presupuesto_id);

        $queryManipulado = $this->db->table($this->table)
            ->select(
                [
                    'lg_tarifa_manipulado.id',
                    'lg_tarifa_manipulado.nombre',

                ]
            )
            ->join('presupuesto_manipulados', 'presupuesto_manipulados.presupuesto_id = presupuestos.id', 'left')
            ->join('lg_tarifa_manipulado', 'lg_tarifa_manipulado.id = presupuesto_manipulados.tarifa_manipulado_id', 'left')
            ->where('presupuestos.id', $presupuesto_id);

        $queryExtras = $this->db->table($this->table)
            ->select(
                [
                    'lg_tarifa_preimpresion.id',
                    'lg_tarifa_preimpresion.nombre',

                ]
            )
            ->join('presupuesto_serviciosExtra', 'presupuesto_serviciosExtra.presupuesto_id = presupuestos.id', 'left')
            ->join('lg_tarifa_preimpresion', 'lg_tarifa_preimpresion.id = presupuesto_serviciosExtra.tarifa_extra_id', 'left')
            ->where('presupuestos.id', $presupuesto_id);

        $servicios['acabado'] = $queryAcabado->get()->getResultObject();
        $servicios['manipulado'] = $queryManipulado->get()->getResultObject();
        $servicios['preimpresion'] = $queryPreimpresion->get()->getResultObject();
        $servicios['extra'] = $queryExtras->get()->getResultObject();
        return $servicios;
    }

    public function getPresupuestosClienteForm($cliente_id = -1){
        $builder = $this->db
        ->table($this->table . " pr")
            ->select('pr.id, pr.created_at as fecha, CONCAT(u.first_name, " ", u.last_name) AS comercial, pr.titulo,  
                pr.paginas as paginas, pr.tirada, pr.total_aceptado as total, pr.estado_id as estado')
            ->join ("clientes c", "pr.cliente_id = c.id", "left")
            ->join("users u", "c.comercial_id= u.id", "left")
            ->where('pr.cliente_id', $cliente_id)
            ->groupBy('pr.id');
        return $builder;
    }

    private function generarConceptoLineasPresupuestoLibro($lineas, $presupuesto)
    {

        $model_papel = model('App\Models\Configuracion\PapelImpresionModel');
        $description_interior = "";
        $description_cubierta = "";
        $description_sobrecubierta = "";
        $paginas_negro = 0;
        $paginas_color = 0;
        $papel_negro = "";
        $papel_color = "";
        $gramaje_negro = 0;
        $gramaje_color = 0;

        $lp_bn_lines = array_filter($lineas, function ($linea) {
            return strpos($linea->tipo, 'lp_bn') === 0;
        });
        $lp_color_lines = array_filter($lineas, function ($linea) {
            return strpos($linea->tipo, 'lp_color') === 0;
        });

        $lp_rot_bn = array_filter($lineas, function ($linea) {
            return strpos($linea->tipo, 'lp_rot_bn') === 0;
        });

        $lp_rot_color = array_filter($lineas, function ($linea) {
            return strpos($linea->tipo, 'lp_rot_color') === 0;
        });

        if (count($lp_bn_lines) > 0) {
            $lp_bn_lines = array_values($lp_bn_lines)[0];
            $paginas_negro = $lp_bn_lines->paginas;
            $gramaje_negro = $lp_bn_lines->gramaje;
            //$papel_negro = $model_papel->where('id', $lp_bn_lines->papel_impresion_id)->first()->nombre;
            $papel_negro = $model_papel->getPapelGenericoNombre($lp_bn_lines->papel_impresion_id);
            $description_interior .= sprintf(
                lang('Pedidos.lineasTemplates.libro_linea_interior'),
                strval($paginas_negro),
                $papel_negro,
                strval($gramaje_negro)
            ) . ". ";
        }
        if (count($lp_color_lines) > 0) {
            $lp_color_lines = array_values($lp_color_lines)[0];
            $paginas_color = $lp_color_lines->paginas;
            $gramaje_color = $lp_color_lines->gramaje;
            //$papel_color = $model_papel->where('id', $lp_color_lines->papel_impresion_id)->first()->nombre;
            $papel_color = $model_papel->getPapelGenericoNombre($lp_color_lines->papel_impresion_id);
            $description_interior .= sprintf(
                lang('Pedidos.lineasTemplates.libro_linea_interior'),
                strval($paginas_color),
                $papel_color,
                strval($gramaje_color)
            ) . ". ";
        }

        if (count($lp_rot_bn) > 0) {
            $lp_rot_bn = array_values($lp_rot_bn)[0];
            $paginas_negro = $lp_rot_bn->paginas;
            $gramaje_negro = $lp_rot_bn->gramaje;
            $papel_negro = $model_papel->getPapelGenericoNombre($lp_rot_bn->papel_impresion_id);
            //$papel_negro = $model_papel->where('id', $lp_rot_bn->papel_impresion_id)->first()->nombre;
            $description_interior .= sprintf(
                lang('Pedidos.lineasTemplates.libro_linea_interior'),
                strval($paginas_negro),
                $papel_negro,
                strval($gramaje_negro)
            ) . ". ";
        }

        if (count($lp_rot_color) > 0) {
            $lp_rot_color = array_values($lp_rot_color)[0];
            $paginas_negro = intval($lp_rot_color->paginas) - intval($lp_rot_color->rotativa_pag_color);
            $gramaje = $lp_rot_color->gramaje;
            //$papel = $model_papel->where('id', $lp_rot_color->papel_impresion_id)->first()->nombre;
            $papel = $model_papel->getPapelGenericoNombre($lp_rot_color->papel_impresion_id);
            if ($paginas_negro > 0) {
                $description_interior .= sprintf(
                    lang('Pedidos.lineasTemplates.libro_linea_interior'),
                    strval($paginas_negro),
                    $papel,
                    strval($gramaje)
                ) . ". ";
            }

            $description_interior .= sprintf(
                lang('Pedidos.lineasTemplates.libro_linea_interior'),
                strval($lp_rot_color->rotativa_pag_color),
                $papel,
                strval($gramaje)
            ) . ". ";
        }

        $lp_cubierta = array_filter($lineas, function ($linea) {
            return strpos($linea->tipo, 'lp_cubierta') === 0;
        });
        $lp_sobrecubierta = array_filter($lineas, function ($linea) {
            return strpos($linea->tipo, 'lp_sobrecubierta') === 0;
        });

        if (count($lp_cubierta) > 0) {
            $lp_cubierta = array_values($lp_cubierta)[0];
            if ($lp_cubierta->paginas == 2) {
                $lp_cubierta->caras = lang('Pedidos.unaCara');
            } else {
                $lp_cubierta->caras = lang('Pedidos.dosCaras');
            }
            $description_cubierta = sprintf(
                lang('Pedidos.lineasTemplates.libro_linea_cubierta'),
                $lp_cubierta->caras,
                //$model_papel->where('id', $lp_cubierta->papel_impresion_id)->first()->nombre,
                $model_papel->getPapelGenericoNombre($lp_cubierta->papel_impresion_id),
                strval($lp_cubierta->gramaje)
            );
            $description_cubierta .= ($presupuesto->solapas_cubierta == 1 ? sprintf(lang('Pedidos.lineasTemplates.libro_solapas'), $presupuesto->solapas_ancho_cubierta) : ". ");
        }
        if (count($lp_sobrecubierta) > 0) {
            $lp_sobrecubierta = array_values($lp_sobrecubierta)[0];
            $description_sobrecubierta = sprintf(
                lang('Pedidos.lineasTemplates.libro_linea_sobrecubierta'),
                //$model_papel->where('id', $lp_sobrecubierta->papel_impresion_id)->first()->nombre,
                $model_papel->getPapelGenericoNombre($lp_sobrecubierta->papel_impresion_id),
                strval($lp_sobrecubierta->gramaje)
            );
            $description_sobrecubierta .= ($presupuesto->solapas_sobrecubierta == 1 ? sprintf(lang('Pedidos.lineasTemplates.libro_solapas'), $presupuesto->solapas_ancho_sobrecubierta) : ". ");
        }

        $acabado = sprintf(
            lang('Pedidos.lineasTemplates.libro_encuadernacion'),
            lang('Presupuestos.' . $presupuesto->codigo_encuadernacion)
        );

        return $description_interior . $description_cubierta . $description_sobrecubierta . $acabado;
    }



}
