<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Session;

use App\Custom\SQLConnection;
use App\Http\Controllers\Traducciones;

class TraduccionServiceProvider extends ServiceProvider {
    /**
     * Register services.
     */
    public function register(): void {
        //
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void {
        // Directive @traducir
        Blade::directive('traducir', function ($array) {
            // Determinar nombre de la vista
            $fullPath = app('view')
                ->getEngineResolver()
                ->resolve('blade')
                ->getCompiler()
                ->getPath();
            $viewFile = basename($fullPath);
            $vista = substr($viewFile, 0, strpos($viewFile, '.'));

            // Cargar o inicializar traducciones de sesión
            $session = Session::get('traducciones', []);
            if (! isset($session[$vista])) {
                $rows = SQLConnection::backendStoreProcedure(
                    'traducciones_web',
                    ['get', env('APP_ID'), $vista, null, null],
                    'select'
                );
                foreach ($rows as $expr) {
                    $session[$vista][strtoupper($expr->app_key)] = (object) [
                        'spa' => trim(str_replace(["'", '"'], '', $expr->spa)),
                        'por' => trim(str_replace(["'", '"'], '', $expr->por)),
                        'eng' => trim(str_replace(["'", '"'], '', $expr->eng)),
                    ];
                }
                Session::put('traducciones', $session);
            }

            // Parsear clave y valor por defecto
            list($rawKey, $rawValue) = explode(',', $array);
            $keyUpper   = strtoupper(trim(str_replace(["'", '"'], '', $rawKey)));
            $cleanValue = trim(str_replace(["'", '"'], '', $rawValue));

            // Si no existe en sesión, insert + catch
            if (! isset($session[$vista][$keyUpper])) {
                try {
                    SQLConnection::backendStoreProcedure(
                        'traducciones_web',
                        ['insert', env('APP_ID'), $vista, $keyUpper, $cleanValue],
                        'selectOne'
                    );
                } catch (QueryException $e) {
                    $driverCode = $e->errorInfo[1] ?? null;
                    if ($driverCode !== 20018) {
                        throw $e;
                    }
                }
                $session[$vista][$keyUpper] = (object) [
                    'spa' => $cleanValue,
                    'por' => $cleanValue,
                    'eng' => $cleanValue,
                ];
                Session::put('traducciones', $session);
            }

            // Recuperar objeto traducción
            $tr = $session[$vista][$keyUpper];
            return "<?php
                    \$lang = Session::get('usuario')->codigo_idioma ?? 'spa';
                    echo \$lang === 'eng'
                        ? '{$tr->eng}'
                        : ( \$lang === 'por'
                            ? '{$tr->por}'
                            : '{$tr->spa}'
                        );
                ?>";

        });

        // Directive @traducirVar (similar lógica)
        Blade::directive('traducirVar', function ($keyvalue) {
            // Determinar nombre de la vista
            $fullPath = app('view')
                ->getEngineResolver()
                ->resolve('blade')
                ->getCompiler()
                ->getPath();
            $viewFile = basename($fullPath);
            $vista = substr($viewFile, 0, strpos($viewFile, '.'));

            // Obtener app_id (webdata o env)
            $app_id = Session::get('webdata.app_id', env('APP_ID'));

            // Cargar o inicializar traducciones de sesión
            $session = Session::get('traducciones', []);
            if (! isset($session[$vista])) {
                $rows = SQLConnection::backendStoreProcedure(
                    'traducciones_web',
                    ['get', $app_id, $vista, null, null],
                    'select'
                );
                foreach ($rows as $expr) {
                    $session[$vista][strtoupper($expr->app_key)] = (object) [
                        'spa' => trim(str_replace(["'", '"'], '', $expr->spa)),
                        'por' => trim(str_replace(["'", '"'], '', $expr->por)),
                        'eng' => trim(str_replace(["'", '"'], '', $expr->eng)),
                    ];
                }
                Session::put('traducciones', $session);
            }

            // Parsear clave y valor por defecto
            list($rawKey, $rawValue) = explode(',', $keyvalue);
            $keyUpper   = strtoupper(trim(str_replace(["'", '"'], '', $rawKey)));
            $cleanValue = trim(str_replace(["'", '"'], '', $rawValue));

            // Si no existe en sesión, insert + catch
            if (! isset($session[$vista][$keyUpper])) {
                try {
                    SQLConnection::backendStoreProcedure(
                        'traducciones_web',
                        ['insert', $app_id, $vista, $keyUpper, $cleanValue],
                        'selectOne'
                    );
                } catch (QueryException $e) {
                    $driverCode = $e->errorInfo[1] ?? null;
                    if ($driverCode !== 20018) {
                        throw $e;
                    }
                }
                $session[$vista][$keyUpper] = (object) [
                    'spa' => $cleanValue,
                    'por' => $cleanValue,
                    'eng' => $cleanValue,
                ];
                Session::put('traducciones', $session);
            }

            // Recuperar objeto traducción
            $tr = $session[$vista][$keyUpper];
            return "<?php
            \$lang = Session::get('usuario')->codigo_idioma ?? 'spa';
                echo \$lang === 'eng'
                    ? '{$tr->eng}'
                    : ( \$lang === 'por'
                        ? '{$tr->por}'
                        : '{$tr->spa}'
                    );
            ?>";
        });
    }
}
