<?php
namespace App\Controllers\Importadores;

use App\Controllers\BaseResourceController;
use App\Entities\Catalogo\CatalogoLibroEntity;
use App\Models\Catalogo\CatalogoLibroModel;
use App\Controllers\Presupuestos\Presupuestocliente;
use App\Services\PresupuestoService;

class ImportadorCatalogo extends BaseResourceController
{

    protected $modelName = CatalogoLibroModel::class;
    protected $format = 'json';

    protected static $singularObjectName = 'Importador';
    protected static $singularObjectNameCc = 'ImportadorCatalogo';
    protected static $pluralObjectName = 'Importadores';
    protected static $pluralObjectNameCc = 'importadores';

    protected static $controllerSlug = 'importador';

    protected static $viewPath = 'themes/vuexy/form/importador/catalogo/';

    protected $indexRoute = 'ImportadorCatalogoTool';


    public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger)
    {
        $this->viewData['pageTitle'] = lang('Importador.listingPage');
        $this->viewData['usingSweetAlert'] = true;

        // Breadcrumbs (IMN)
        $this->viewData['breadcrumb'] = [
            ['title' => lang("App.menu_importadores"), 'route' => "javascript:void(0);", 'active' => false],
            ['title' => lang("App.menu_importadores_catalogo"), 'route' => route_to('importadorCatalogoTool'), 'active' => true]
        ];

        parent::initController($request, $response, $logger);
    }


    public function index()
    {

        $viewData = [
            'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Importador.importadorCatalogoTitle')]),
            
        ];

        $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class

        return view(static::$viewPath . 'viewImportadorCatalogoTool', $viewData);
    }


    public function validarFila()
    {
        $json = $this->request->getJSON();

        if (!$json || !isset($json->fila[0])) {
            return $this->response->setJSON([
                'apto' => false,
                'reason' => 'Datos inválidos'
            ]);
        }

        $input = trim($json->fila[0]); // Asumimos que 'input' es el primer campo de la fila

        if (empty($input)) {
            return $this->response->setJSON([
                'apto' => false,
                'reason' => 'ISBN no proporiconado'
            ]);
        }

        $catalogoModel = new CatalogoLibroModel();

        // 1. Buscar por ISBN exacto
        $libroPorIsbn = $catalogoModel->where('isbn', $input)->first();

        if ($libroPorIsbn) {
            return $this->response->setJSON([
                'apto' => true
            ]);
        }

        // 2. Buscar por EAN sin guiones
        $eanLimpio = str_replace('-', '', $input);

        $libroPorEan = $catalogoModel->where('REPLACE(ean, "-", "")', $eanLimpio)->first();

        if ($libroPorEan) {
            return $this->response->setJSON([
                'apto' => true
            ]);
        }

        // No encontrado
        return $this->response->setJSON([
            'apto' => false,
            'reason' => 'No encontrado en catálogo'
        ]);
    }



    public function importarFila()
    {
        $json = $this->request->getJSON();

        if (!$json || !isset($json->fila[0])) {
            return $this->response->setJSON([
                'success' => false,
                'message' => 'Datos inválidos.'
            ]);
        }

        // Mapear cada columna a una variable
        $isbn = isset($json->fila[0]) ? trim($json->fila[0]) : null;
        $refCliente = isset($json->fila[1]) ? trim($json->fila[1]) : null;
        //$descripcion = isset($json->fila[2]) ? trim($json->fila[2]) : null;
        $tirada = isset($json->fila[3]) ? (float) $json->fila[3] : null;
        $precio_compra = isset($json->fila[4]) ? (float) $json->fila[4] : null;

        if (empty($isbn)) {
            return $this->response->setJSON([
                'success' => false,
                'message' => 'Input vacío o no proporcionado.'
            ]);
        }

        $catalogoModel = new CatalogoLibroModel();

        // 1. Buscar por ISBN exacto
        $libro = $catalogoModel->where('isbn', $isbn)->first();

        // 2. Si no, buscar por EAN sin guiones
        if (!$libro) {
            $eanLimpio = str_replace('-', '', $isbn);

            $libro = $catalogoModel->where('REPLACE(ean, "-", "")', $eanLimpio)->first();
        }

        if (!$libro) {
            return $this->response->setJSON([
                'success' => false,
                'message' => 'No se encontró el libro en el catálogo.'
            ]);
        }

        // Aquí ya tenemos el libro correcto.
        // Ahora se prepara la "inserción" o el "registro" a importar
        // Variables intermedias
        $colorPaginas = (int) ($libro->color_paginas ?? 0);
        $negroPaginas = (int) ($libro->negro_paginas ?? 0);
        $papelInteriorDiferente = ($colorPaginas > 0 && $negroPaginas > 0) ? 1 : 0;

        // --- Interior (lo que cambiamos ahora)
        if ($papelInteriorDiferente) {
            // Mixto: páginas en negro + color
            $interior = [
                'papelInterior' => [
                    'negro' => $libro->negro_papel_id,
                    'color' => $libro->color_papel_id,
                ],
                'gramajeInterior' => [
                    'negro' => $libro->negro_gramaje,
                    'color' => $libro->color_gramaje,
                ]
            ];
        } else {
            // SOLO un tipo: negro O color
            $colorPaginas = (int) ($libro->color_paginas ?? 0);
            $negroPaginas = (int) ($libro->negro_paginas ?? 0);

            if ($colorPaginas > 0 && $negroPaginas == 0) {
                // Libro completamente en color
                $interior = [
                    'papelInterior' => $libro->color_papel_id,
                    'gramajeInterior' => $libro->color_gramaje,
                ];
            } else {
                // Libro completamente en blanco y negro
                $interior = [
                    'papelInterior' => $libro->negro_papel_id,
                    'gramajeInterior' => $libro->negro_gramaje,
                ];
            }
        }

        // Sobrecubierta
        $sobrecubierta = [];
        if (!is_null($libro->sobrecubierta_paginas)) {
            $sobrecubierta['papel'] = $libro->sobrecubierta_papel_id;
            $sobrecubierta['gramaje'] = $libro->sobrecubierta_gramaje;
            $sobrecubierta['solapas'] = $libro->sobrecubierta_solapas;
            $sobrecubierta['acabado'] = $libro->sobrecubierta_acabado_id;
        }


        $dataToImport = [
            'selectedTirada' => $tirada,
            'datosCabecera' => [
                'titulo' => $libro->titulo,
                'autor' => $libro->autor,
                'isbn' => $isbn,
                'coleccion' => $libro->coleccion,
                'referenciaCliente' => $refCliente
            ],
            'tirada' => array_values(array_filter([
                $tirada,
                null,
                null,
                null,
            ])),
            'tamanio' => [
                'ancho' => $libro->ancho,
                'alto' => $libro->alto
            ],
            'tipo' => "",
            'tipo_presupuesto_id' => $libro->encuadernacion_id,
            'clienteId' => 251,
            'isColor' => (in_array(strtolower($libro->tipo_impresion), ['color', 'colorhq']) ? 1 : 0),
            'isHq' => (in_array(strtolower($libro->tipo_impresion), ['negrohq', 'colorhq']) ? 1 : 0),
            'paginas' => $libro->paginas,
            'paginasColor' => $colorPaginas,
            'papelInteriorDiferente' => $papelInteriorDiferente,
            'paginasCuadernillo' => 32,

            'interior' => $interior,

            'cubierta' => [
                'papelCubierta' => $libro->cubierta_papel_id,
                'gramajeCubierta' => $libro->cubierta_gramaje,
                'solapas' => $libro->cubierta_ancho_solapas,
                'acabado' => $libro->cubierta_acabado_id,
                'cabezada' => 'WHI',
                'lomoRedondo' => 0
            ],

            'ivaReducido' => 1,

            'guardas' => [],
            'sobrecubierta' => $sobrecubierta,
            //'faja' => null,

            'entrega_taller' => 1,
        ];

        /*return $this->response->setJSON([
            'success' => true,
            'message' => 'Libro encontrado y preparado para importar.',
            'data' => $dataToImport
        ]);*/


        // Procedemos a intentar guardar el presupuesto
        // Instancia de presupuesto cliente
        $presupuestocliente = new Presupuestocliente();
        try {
            $response = $presupuestocliente->guardar($dataToImport);

            // DEBUG LINE
            //return $this->respond($response);

            if (!isset($response['sk_id'])) {
                return $this->respond([
                    'status' => 400,
                    'error' => 'Missing sk_id',
                    'message' => 'El identificador sk_id es requerido pero no se recibió.'
                ], 400);
            }

            $response = [
                'status' => 200,
                'error' => null,
                'data' => [
                    'sk_id' => $response['sk_id'],
                    'sk_url' => $response['sk_url'] ?? null
                ]
            ];


            // Ajuste del precio a RAMA
            $respuesta_ajuste = PresupuestoService::ajustarPresupuesto(
                $response['data']['sk_id'],
                $precio_compra,
                $tirada,
                null, 
                true
            );
            if ($respuesta_ajuste['warning'] == true) {
                $response['price_warning'] = [
                    'new_precio_unidad' => $respuesta_ajuste['new_precio_unidad'],
                    'new_total' => $respuesta_ajuste['new_total'],
                ];
            }

            // confirmar y crear pedido y ot
            model('App\Models\Presupuestos\PresupuestoModel')->confirmarPresupuesto($response['data']['sk_id']);
            PresupuestoService::crearPedido($response['data']['sk_id']);

            return $this->respond($response);

        } catch (\Exception $e) {

            return $this->respond([
                'status' => 500,
                'error' => 'Server error',
                'message' => 'Error inesperado durante el procesado',
                'debug' => $e->getMessage()
            ]);

        }

    }




}
