<?php
/*
    Desarrollador: Ing. Jean Jairo Benitez Meza
    Ultima Modificación: 10/10/2023
    Módulo: Gestión de Adquisiciones
*/
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\ResponseController;
use App\Http\Controllers\ResourcesController;
use App\Http\Controllers\EncryptionController;
use App\Http\Controllers\DocumentManagementController;
use App\Http\Controllers\FunctionsController;


class ArtitleController extends Controller {

    private $responseController;
    private $encController;
    private $resourcesController;
    private $documentManagementController;
    private $functionsController;

    public function __construct() {
        $this->responseController = new ResponseController();
        $this->encController = new EncryptionController();
        $this->resourcesController = new ResourcesController();
        $this->documentManagementController = new DocumentManagementController();
        $this->functionsController = new FunctionsController();
    }

    // Función para obtener las familias y las subfamilias activas
    public function getFamiliesAndSubfamilies ($user, $line) {
        try {
            $arrFamilias = DB::table('S002V01TFAMI')
                ->where('FAMI_ESTA', '=', 'Activo')
                ->where('FAMI_NULI', '=', $line)
                ->get([
                    'FAMI_COFA AS ID_FAMILIA',
                    'FAMI_NOFA AS FAMILIA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETFAMILYS000: No se pudo realizar la consulta de las familias en la base.", 
                $th->getMessage(), 
                500
            );
        }
        
        try {
            $arrSubfamilias = DB::table('S002V01TSUBF')
                ->where('SUBF_ESTA', '=', 'Activo')
                ->where('SUBF_NULI', '=', $line)
                ->get([
                    'SUBF_COSU AS ID_SUBFAMILIA',
                    'SUBF_NOSU AS SUBFAMILIA',
                    'SUBF_COFA AS ID_FAMILIA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETFAMILYS001: No se pudo realizar la consulta de las subfamilias en la base.", 
                $th->getMessage(), 
                500
            );
        }

        try {
            foreach ($arrFamilias as $keyFamilias => $familias) {
                $familias->SUBFAMILIAS = array();
                foreach ($arrSubfamilias as $keySubfamilias => $subfamilias) {
                    if ($familias->ID_FAMILIA == $subfamilias->ID_FAMILIA) {
                        $familias->SUBFAMILIAS[] = array(
                            "ID_SUBFAMILIA" => $subfamilias->ID_SUBFAMILIA,
                            "SUBFAMILIA" => $subfamilias->SUBFAMILIA,
                        );
                    }
                }
            }
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETFAMILYS002: Ocurrió un error al generar la respuesta de la consulta.", 
                $th->getMessage(), 
                500
            );
        }
        

        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrFamilias);
    }

    public function registerFamily(Request $request){
        $valitador = Validator::make($request->all(), [
            'FAMILIA' => 'required|string|max:50',
            'LINE' => 'required|integer',
            'USER' => 'required|string'
        ]);
        if ($valitador->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_FAMILY_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($valitador->errors()->messages()),
                401
            );
        }

        DB::beginTransaction();
        $responseData = $request->all();
        
        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($responseData['USER'], $responseData['LINE']);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_FAMILY_REG001:'.$arrResponseCheckUser['msg'], [], 401);
        }
        $usuario = $arrResponseCheckUser['response'];

        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $validateInsert = DB::table('S002V01TFAMI')->insert([
                "FAMI_NOFA" => trim($responseData['FAMILIA']),
                "FAMI_USRE" => $usuario,
                "FAMI_NULI" => $responseData['LINE'],
                "FAMI_FERE" => $currentDate,
                "FAMI_FEAR" => DB::raw('CURRENT_TIMESTAMP')
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_FAMILY_REG002: Ocurrió un error al ingresar los registros.", $th->getMessage(), 401);
        }

        if (!$validateInsert) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_FAMILY_REG003: No se pudo ingresar los datos a la base de datos.", [], 401);
        }

        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function getUnits($user, $line) {
        try {
            $arrFamilias = DB::table('S002V01TUNID')
                ->where('UNID_NULI', '=', $line)
                ->get([
                    'UNID_IDUN AS ID_UNIDAD',
                    'UNID_NOMB AS UNIDAD',
                    'UNID_ESTA AS ESTADO',
                    'UNID_USRE AS USUARIO_REGISTRA',
                    'UNID_FERE AS FECHA_REGISTRA',
                    'UNID_USMO AS USUARIO_MODIFICA',
                    'UNID_FEMO AS FECHA_MODIFICA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETUNITS000: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta exitosa", $arrFamilias);
    }

    public function getUnitsActives($user, $line) {

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($user, $line);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_UNITS_GETACTIVES000:'.$arrResponseCheckUser['msg'], [], 401);
        }

        try {
            $arrFamilias = DB::table('S002V01TUNID')
                ->where('UNID_NULI', '=', $line)
                ->where('UNID_ESTA', '=', 'Activo')
                ->get([
                    'UNID_IDUN AS ID_UNIDAD',
                    'UNID_NOMB AS UNIDAD',
                    'UNID_USRE AS USUARIO_REGISTRA',
                    'UNID_FERE AS FECHA_REGISTRA',
                    'UNID_USMO AS USUARIO_MODIFICA',
                    'UNID_FEMO AS FECHA_MODIFICA',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_UNITS_GETACTIVES001: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrFamilias);
    }

    public function registerUnit(Request $request){
        $valitador = Validator::make($request->all(), [
            'UNIDAD' => 'required|string|max:50',
            'LINE' => 'required|integer',
            'USER' => 'required|string'
        ]);
        if ($valitador->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_UNITS_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($valitador->errors()->messages()),
                401
            );
        }

        DB::beginTransaction();
        $responseData = $request->all();

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($responseData['USER'], $responseData['LINE']);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_UNITS_REG001:'.$arrResponseCheckUser['msg'], [], 401);
        }
        $usuario = $arrResponseCheckUser['response'];

        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $validateInsert = DB::table('S002V01TUNID')->insert([
                "UNID_NOMB" => trim($responseData['UNIDAD']),
                "UNID_USRE" => $usuario,
                "UNID_NULI" => $responseData['LINE'],
                "UNID_FERE" => $currentDate,
                "UNID_FEAR" => DB::raw('CURRENT_TIMESTAMP')
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(
                true, 
                "ERR_UNITS_REG002: Ocurrió un error al ingresar los registros.", 
                $th->getMessage(), 
                401
            );
        }

        if (!$validateInsert) {
            DB::rollBack();
            return $this->responseController->makeResponse(
                true, 
                "ERR_UNITS_REG003: No se pudo ingresar los datos a la base de datos.", 
                [], 
                401
            );
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function registerSubfamily(Request $request){
        $valitador = Validator::make($request->all(), [
            'ID_FAMILIA' => 'required|integer',
            'SUBFAMILIA' => 'required|string|max:50',
            'LINE' => 'required|integer',
            'USER' => 'required|string'
        ]);
        if ($valitador->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_SUBFAMILY_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($valitador->errors()->messages()),
                401
            );
        }

        DB::beginTransaction();
        $responseData = $request->all();

        try {
            $validateExists = DB::table('S002V01TFAMI')
                ->where('FAMI_COFA', '=', trim($responseData['ID_FAMILIA']))
                ->where('FAMI_ESTA', '=', 'Activo')
                ->where('FAMI_NULI', '=', $responseData['LINE'])
                ->exists();
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(
                true, 
                "ERR_SUBFAMILY_REG001: Ocurrió al verificar la Familia.", 
                $th->getMessage(), 
                401
            );
        }
        
        if (!$validateExists) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_SUBFAMILY_REG002: La Familia seleccionada no existe.", 
                [], 
                401
            );
        }

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($responseData['USER'], $responseData['LINE']);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_SUBFAMILY_REG003:'.$arrResponseCheckUser['msg'], [], 401);
        }
        $user = $arrResponseCheckUser['response'];


        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $validateInsert = DB::table('S002V01TSUBF')->insert([
                "SUBF_COFA" => $responseData['ID_FAMILIA'],
                "SUBF_NOSU" => $responseData['SUBFAMILIA'],
                "SUBF_USRE" => $user,
                "SUBF_NULI" => $responseData['LINE'],
                "SUBF_FERE" => $currentDate,
                "SUBF_FEAR" => DB::raw('CURRENT_TIMESTAMP')
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(
                true, 
                "ERR_SUBFAMILY_REG004: Ocurrió un error al ingresar los registros.", 
                $th->getMessage(), 
                401
            );
        }
        if (!$validateInsert) {
            DB::rollBack();
            return $this->responseController->makeResponse(
                true, 
                "ERR_SUBFAMILY_REG005: No se pudo ingresar los datos a la base de datos.", 
                [], 
                401
            );
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function getArtitles($user, $line) {

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($user, $line);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_GET000:'.$arrResponseCheckUser['msg'], [], 401);
        }

        try {
            $getArtitle = DB::table('S002V01TARTI')
                ->where("ARTI_NULI", "=", $line)
                ->where("FAMI_NULI", "=", $line)
                ->where("SUBF_NULI", "=", $line)
                ->where("DEAR_NULI", "=", $line)
                ->where("PROV_NULI", "=", $line)
                ->where("UNID_NULI", "=", $line)
                ->where("ARTI_ESTA", "=", "Activo")
                ->where("FAMI_ESTA", "=", "Activo")
                ->where("SUBF_ESTA", "=", "Activo")
                ->where("DEAR_ESTA", "=", "Activo")
                ->where("PROV_ESTA", "=", "Activo")
                ->where("UNID_ESTA", "=", "Activo")
                ->join("S002V01TFAMI", "ARTI_COFA", "=", "FAMI_COFA")
                ->join("S002V01TSUBF", "ARTI_COSU", "=", "SUBF_COSU")
                ->join("S002V01TDEAR", "ARTI_IDAR", "=", "DEAR_IDAR")
                ->join("S002V01TPROV", "DEAR_NUPR", "=", "PROV_NUPR")
                ->join("S002V01TUNID", "DEAR_IDUN", "=", "UNID_IDUN")
                ->get([
                    "DEAR_IDDE AS ID_DESC_ARTI",
                    "ARTI_IDAR AS ID_ARTICULO",
                    "ARTI_NOMB AS MODELO",
                    "FAMI_COFA AS ID_FAMILIA",
                    "FAMI_NOFA AS FAMILIA",
                    "SUBF_COSU AS ID_SUBFAMILIA",
                    "SUBF_NOSU AS SUBFAMILIA",
                    "DEAR_DESC AS DESCRIPCION",
                    "DEAR_CARA AS CARACTERISTICAS",
                    "DEAR_COWE AS COMPRA_WEB",
                    "DEAR_IDUN AS TIPO_UNIDAD",
                    "DEAR_IMAG AS URL_IMAGEN",
                    "PROV_NUPR AS ID_PROVEEDOR",
                    "PROV_NOCO AS PROVEEDOR",
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GET001: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }

        try {
            foreach ($getArtitle as $artitle) {
                $arrImagen = json_decode($artitle->URL_IMAGEN);
                $arrUrlImage = array();
                foreach ($arrImagen as $key => $imagen) {
                    $responseDocument = $this->documentManagementController->getPublicDocumentURL($imagen, $user, $line);
                    
                    $arrResponseDocument = json_decode($responseDocument->original, true);
                    if ($arrResponseDocument['error']) {
                        return $this->responseController->makeResponse(true, "ERR_ARTITLE_GET002: Ocurrió un error al obtener la URL de la imágen.", [], 500);
                    }
                    $arrUrlImage[] = $arrResponseDocument['response']['public_uri'];
                }
                $artitle->URL_IMAGEN = $arrUrlImage;
                    
            }
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GET003: Ocurrió un error al obtener las imangenes de los artículos.", 
                $th->getMessage(), 
                500
            );
        }
        
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $getArtitle);
    }

    public function getArtitlesByProvider($artitle, $provider, $user, $line) {

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($user, $line);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_GETBYPROVIDER000:'.$arrResponseCheckUser['msg'], [], 401);
        }

        try {
            $idArtitle = $this->encController->decrypt($artitle);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYPROVIDER001: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }

        try {
            $idProvider = $this->encController->decrypt($provider);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYPROVIDER002: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }
        
        try {
            $objArtitle = (array) DB::table('S002V01TDEAR')
                ->where("ARTI_NULI", "=", $line)
                ->where("DEAR_IDDE", "=", $idArtitle)
                ->where("DEAR_NUPR", "=", $idProvider)
                ->join("S002V01TARTI", "ARTI_IDAR", "=", "DEAR_IDAR")
                ->join("S002V01TFAMI", "ARTI_COFA", "=", "FAMI_COFA")
                ->join("S002V01TSUBF", "ARTI_COSU", "=", "SUBF_COSU")
                ->join("S002V01TPROV", "DEAR_NUPR", "=", "PROV_NUPR")
                ->join("S002V01TUNID", "DEAR_IDUN", "=", "UNID_IDUN")
                ->first([
                    "DEAR_IDDE AS ID_DESC_ARTI",
                    "ARTI_IDAR AS ID_ARTICULO",
                    "ARTI_NOMB AS MODELO",
                    "FAMI_COFA AS ID_FAMILIA",
                    "FAMI_NOFA AS FAMILIA",
                    "SUBF_COSU AS ID_SUBFAMILIA",
                    "SUBF_NOSU AS SUBFAMILIA",
                    "DEAR_DESC AS DESCRIPCION",
                    "DEAR_CARA AS CARACTERISTICAS",
                    "DEAR_COWE AS COMPRA_WEB",
                    "UNID_IDUN AS ID_UNIDAD",
                    "UNID_NOMB AS UNIDAD",
                    "DEAR_IMAG AS URL_IMAGEN",
                    "PROV_NUPR AS ID_PROVEEDOR",
                    "PROV_NOCO AS PROVEEDOR",
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYPROVIDER003: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }
        if ( empty($objArtitle) ) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYPROVIDER004: No se encontró el resultado deseado.", [], 500);
        }
        
        try {
            $objArtitle['URL_IMAGEN'] = json_decode($objArtitle['URL_IMAGEN']);
            $arrUrlImage = array();
            foreach ($objArtitle['URL_IMAGEN'] as $key => $encImage) {
                $responseDocument = $this->documentManagementController->getPublicDocumentURL($encImage, $user, $line);
                $arrResponseDocument = json_decode($responseDocument->original, true);
                if ($arrResponseDocument['error']) {
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYPROVIDER005: Ocurrió un error al obtener la URL de la imágen.", [], 500);
                }
                $arrUrlImage[] = $arrResponseDocument['response']['public_uri'];
            }
            $objArtitle['URL_IMAGEN'] = $arrUrlImage;
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYPROVIDER006: Ocurrió un error al obtner las imagenes de los artículos", 
                $th->getMessage(), 
                500
            );
        }

        try {
            $arrInformation = DB::table('S002V01TINAR')
                ->where('INAR_ESTA', '=', 'Activo')
                ->where('INAR_NULI', '=', $line)
                ->where('INAR_IDDE', '=', $objArtitle['ID_DESC_ARTI'])
                ->join('S002V01TCAMO', 'CAMO_COMO', '=', 'INAR_COMO')
                ->get([
                    'INAR_IDIN AS NUMERO_INFORMACION',
                    'INAR_CODI AS CODIGO',
                    'INAR_MODE AS MODELO',
                    'CAMO_COMO AS MONEDA',
                    'CAMO_DESC AS MONEDA_DESCRIPCION',
                    'INAR_PREC AS PRECIO',
                    'INAR_MOMI AS MONTO_MINIMO',
                    'INAR_CARA AS CARACTERISTICAS',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYPROVIDER007: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }

        $objArtitle['INFO_PRODUCTO'] = json_encode($arrInformation);
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $objArtitle);
    }

    public function getArtitleById($encIdArtitle, $user, $line) {

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($user, $line);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_GETBYID000:'.$arrResponseCheckUser['msg'], [], 401);
        }

        try {
            $idArtitle = $this->encController->decrypt($encIdArtitle);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYID001: Ocurrió un error al obtener el artículo.", 
                $th->getMessage(), 
                500
            );
        }
        
        try {
            $arrArtitle = DB::table('S002V01TARTI')
                ->where('ARTI_IDAR', '=', $idArtitle)
                ->where('ARTI_ESTA', '=', 'Activo')
                ->where('ARTI_NULI', '=', $line)
                ->join("S002V01TFAMI", "ARTI_COFA", "=", "FAMI_COFA")
                ->join("S002V01TSUBF", "ARTI_COSU", "=", "SUBF_COSU")
                ->first([
                    'ARTI_IDAR AS NUMERO_ARTICULO',
                    'ARTI_CODI AS CODIGO',
                    "FAMI_COFA AS ID_FAMILIA",
                    "FAMI_NOFA AS FAMILIA",
                    "SUBF_COSU AS ID_SUBFAMILIA",
                    "SUBF_NOSU AS SUBFAMILIA",
                    'ARTI_NOMB AS ARTICULO',
                ]);

        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYID002: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }

        try {
            $arrDescription = DB::table('S002V01TDEAR')
                ->where('DEAR_IDAR', '=', $idArtitle)
                ->where('DEAR_ESTA', '=', 'Activo')
                ->where('DEAR_NULI', '=', $line)
                ->join("S002V01TUNID", "DEAR_IDUN", "=", "UNID_IDUN")
                ->get([
                    'DEAR_IDDE AS ID_DESCRIPCION',
                    'DEAR_DESC AS DESCRIPCION',
                    'DEAR_CARA AS CARACTERISTICAS',
                    'DEAR_COWE AS COMPRA_WEB',
                    'DEAR_IDUN AS TIPO_UNIDAD',
                    'DEAR_IMAG AS IMAGEN',
                    'DEAR_NUPR AS PROVEEDOR',
                    'DEAR_ESTA AS ESTADO',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYID003: No se pudo realizar la consulta a la base.", 
                $th->getMessage(), 
                500
            );
        }
        if ( empty($arrDescription) ) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYID004: No se encontró ninguna descripción.", 
                [], 
                500
            );
        }

        // Se obtienen las URL de las imagenes de los artículos
        try {
            foreach ($arrDescription as $description) {
                $arrImagen = json_decode($description->IMAGEN);
                $arrUrlImage = array();
                foreach ($arrImagen as $key => $imagen) {
                    $responseDocument = $this->documentManagementController->getPublicDocumentURL($imagen, $user, $line);
                    $arrResponseDocument = json_decode($responseDocument->original, true);
                    if ($arrResponseDocument['error']) {
                        return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYID005: Ocurrió un error al obtener la URL de la imágen.", [], 500);
                    }
                    $arrUrlImage[] = $arrResponseDocument['response']['public_uri'];
                }
                $description->IMAGEN = $arrUrlImage;
            }
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_GETBYID006: Ocurrió un error al obtener las imágenes de los artículos.", 
                [], 
                500
            );
        }
        

        foreach ($arrDescription as $description) {
            try {
                $arrDetails = DB::table('S002V01TINAR')
                    ->where('INAR_IDDE', '=', $description->ID_DESCRIPCION)
                    ->where('INAR_ESTA', '=', 'Activo')
                    ->where('INAR_NULI', '=', $line)
                    ->join('S002V01TCAMO', 'CAMO_COMO', '=', 'INAR_COMO')
                    ->get([
                        'INAR_IDIN AS NUMERO_DETALLE',
                        'INAR_CODI AS CODIGO',
                        'INAR_MODE AS MODELO',
                        DB::raw('CONCAT("(", CAMO_COMO, ") ", CAMO_DESC) AS MONEDA'),
                        'INAR_PREC AS PRECIO',
                        'INAR_MOMI AS MONTO_MINIMO',
                        // 'INAR_CANT AS CANTIDAD',
                        'INAR_CARA AS CARACTERISTICAS',
                        'INAR_ESTA AS ESTADO',
                    ]);
            } catch (\Throwable $th) {
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYID007: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
            }

            $description->DETALLES = $arrDetails;
            try {
                $objProdiver = DB::table('S002V01TPROV')
                    ->where('PROV_NUPR', '=', $description->PROVEEDOR)
                    ->where('PROV_ESTA', '=', 'Activo')
                    ->where('PROV_NULI', '=', $line)
                    ->first([
                        'PROV_NUPR',
                        'PROV_NOCO',
                        'PROV_NOMB',
                        'PROV_APPA',
                        'PROV_APMA',
                        'PROV_CORR',
                        'PROV_LAD1',
                        'PROV_TEL1',
                        'PROV_LAD2',
                        'PROV_TEL2',
                        'PROV_XRFC',
                        'PROV_XTAX',
                        'PROV_CRFI',
                        'PROV_TIPO',
                        'PROV_SIWE',
                        'PROV_MEPA',
                        'PROV_USRE',
                        'PROV_FERE',
                        'PROV_USMO',
                        'PROV_FEMO',
                    ]);
            $description->PROVEEDOR = $objProdiver;
            } catch (\Throwable $th) {
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYID008: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
            }
        }

        $arrArtitle->INFORMACION = $arrDescription;

        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrArtitle);
    }

    public function getAllArtitles($user, $line) {

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($user, $line);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_GETALL000:'.$arrResponseCheckUser['msg'], [], 401);
        }

        try {
            $arrArtitle = DB::table('S002V01TARTI')
                ->where("ARTI_NULI", "=", $line)
                ->join("S002V01TFAMI", "ARTI_COFA", "=", "FAMI_COFA")
                ->join("S002V01TSUBF", "ARTI_COSU", "=", "SUBF_COSU")
                ->get([
                    "ARTI_IDAR AS ID_ARTICULO",
                    "ARTI_NOMB AS MODELO",
                    "FAMI_COFA AS ID_FAMILIA",
                    "FAMI_NOFA AS FAMILIA",
                    "SUBF_COSU AS ID_SUBFAMILIA",
                    "SUBF_NOSU AS SUBFAMILIA",
                    "ARTI_ESTA AS ESTADO",
                    "ARTI_USRE AS USUARIO_REGISTRA",
                    "ARTI_FERE AS FECHA_REGISTRA",
                    "ARTI_USMO AS USUARIO_MODIFICA",
                    "ARTI_FEMO AS FECHA_MODIFICA",
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETALL001: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrArtitle);
    }

    public function registerArtitles(Request $request) {
        $validator = Validator::make($request->all(), [
            'CODIGO' => 'required|string',
            'ARTICULO' => 'required|string',
            'FAMILIA' => 'required|string',
            'SUBFAMILIA' => 'required|string',
            'INFORMATION' => 'required|array',
            'USUARIO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_REG000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }

        DB::beginTransaction();
        $requestData = $request->all();

        foreach ($requestData['INFORMATION'] as $information) {
            $validator = Validator::make($information, [
                'NO' => 'required|string',
                'IMAGEN' => 'required|array',
                'DESCRIPCION' => 'required|string',
                // 'CARACTERISTICAS' => '|string',
                'TIPO_UNIDAD' => 'required|integer',
                'PROVEEDOR' => 'required|string',
                'COMPRA_WEB' => 'required|boolean',
                'ESTADO' => 'required|string',
                'DETAILS' => 'required|array',
            ]);
            if ($validator->fails()) {
                return $this->responseController->makeResponse(
                    true,
                    "ERR_ARTITLE_REG001: Se encontraron uno o más errores.",
                    $this->responseController->makeErrors($validator->errors()->messages()),
                    401
                );
            }


            foreach ($information['DETAILS'] as $details) {
                $validator = Validator::make($details, [
                    'NO' => 'required|string',
                    'CODIGO' => 'required|string',
                    'MODELO' => 'required|string',
                    'MONEDA' => 'required|string',
                    'PRECIO' => 'required|string',
                    'MONTO_MINIMO' => 'required|string',
                    'ESTADO' => 'required|string',
                    'CARACTERISTICAS' => 'required|string',
                ]);
                if ($validator->fails()) {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_REG002: Se encontraron uno o más errores.",
                        $this->responseController->makeErrors($validator->errors()->messages()),
                        401
                    );
                }
            }
        }

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($requestData['USUARIO'], $requestData['NUMERO_LINEA']);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG003:'.$arrResponseCheckUser['msg'], [], 401);
        }
        $usuario = $arrResponseCheckUser['response'];

        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $idArtitle = DB::table('S002V01TARTI')->insertGetId([
                'ARTI_CODI' => $requestData['CODIGO'],
                'ARTI_COFA' => $requestData['FAMILIA'],
                'ARTI_COSU' => $requestData['SUBFAMILIA'],
                'ARTI_NOMB' => $requestData['ARTICULO'],
                'ARTI_NULI' => $requestData['NUMERO_LINEA'],
                'ARTI_USRE' => $usuario,
                'ARTI_FERE' => $currentDate,
                'ARTI_FEAR' => DB::raw('CURRENT_TIMESTAMP')
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG004: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }


        foreach ($requestData['INFORMATION'] as $keyInformation => $information) {
            try {
                $arrCodeImages = array();
                foreach ($information['IMAGEN'] as $key => $encIdFile) {
                    $idFile = $this->encController->decrypt($encIdFile);
                    $tempFile = DB::table('S002V01TARTE')->where([
                        ['ARTE_NULI', '=', $requestData['NUMERO_LINEA']],
                        ['ARTE_IDAR', '=', $idFile],
                    ])->first();
                    if(is_null($tempFile)){
                        return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG005: El archivo consultado no está registrado', [], 404);
                    }else if($tempFile->ARTE_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG006: El archivo consultado está eliminado', [], 404);
                    }
                    $fileResponse = $this->documentManagementController->moveFinalFile(
                        intval($requestData['NUMERO_LINEA']),
                        'GEAD',
                        'FO',
                        $tempFile,
                        $usuario,
                    );
                    if(!$fileResponse[0]){
                        return $this->responseController->makeResponse(true, 'ERR_ARTITLE_REG007: '.$fileResponse[1], [], 400);
                    }
                    $arrCodeImages[] = $this->encController->encrypt($fileResponse[1]);
                }
                $jsonImages = json_encode($arrCodeImages);
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG008: Ocurrió un error al obtener la URL pública de las imágenes.", $th->getMessage(), 500);
            }
            

            try {
                $idDescription = DB::table('S002V01TDEAR')->insertGetId([
                    'DEAR_DESC' => $information['DESCRIPCION'],
                    'DEAR_CARA' => $information['CARACTERISTICAS'],
                    'DEAR_COWE' => $information['COMPRA_WEB'],
                    'DEAR_IDUN' => $information['TIPO_UNIDAD'],
                    'DEAR_IMAG' => $jsonImages,
                    'DEAR_NUPR' => $information['PROVEEDOR'],
                    'DEAR_IDAR' => $idArtitle,
                    'DEAR_NULI' => $requestData['NUMERO_LINEA'],
                    'DEAR_USRE' => $usuario,
                    'DEAR_FERE' => $currentDate,
                    'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                ]);
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG009: Ocurrió un error al insertar los datos de la información del artículo.", $th->getMessage(), 500);
            }
            $arrDetails = $information['DETAILS'];

            foreach ($arrDetails as $keyDetails => $details) {
                $insertDetails = [
                    'INAR_IDDE' => $idDescription,
                    'INAR_CODI' => $details['CODIGO'],
                    'INAR_MODE' => $details['MODELO'],
                    'INAR_COMO' => $details['MONEDA'],
                    'INAR_PREC' => $details['PRECIO'],
                    'INAR_MOMI' => $details['MONTO_MINIMO'],
                    'INAR_CARA' => $details['CARACTERISTICAS'],
                    'INAR_NULI' => $requestData['NUMERO_LINEA'],
                    'INAR_USRE' => $usuario,
                    'INAR_FERE' => $currentDate,
                    'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                ];
                try {
                    $validateDetails = DB::table('S002V01TINAR')->insert($insertDetails);
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG010: Ocurrió un error al insertar los datos de los detalles del artículo.", $th->getMessage(), 500);
                }

                if (!$validateDetails) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_REG011: No se pudo insertar los datos de los detalles.", [], 500);
                }
            }
        }
        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
    }

    public function updateArtitles(Request $request) {
        $validator = Validator::make($request->all(), [
            'NO' => 'required|string',
            'CODIGO' => 'required|string',
            'ARTICULO' => 'required|string',
            'FAMILIA' => 'required|string',
            'SUBFAMILIA' => 'required|string',
            'USUARIO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
            'INFORMATION' => 'required',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_MOD000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }
        DB::beginTransaction(); # Para impedir que las actualizaciones queden a incompletas
        $requestData = $request->all();
        foreach ($requestData['INFORMATION'] as $information) {
            $validator = Validator::make($information, [
                'NO' => 'required|integer',
                'IMAGEN' => 'required|array',
                'DESCRIPCION' => 'required|string',
                // 'CARACTERISTICAS' => '|string',
                'TIPO_UNIDAD' => 'required|integer',
                'PROVEEDOR' => 'required|string',
                'COMPRA_WEB' => 'required|boolean',
                'ESTADO' => 'required|string',
                'DETAILS' => 'required|array',
            ]);
            if ($validator->fails()) {
                return $this->responseController->makeResponse(
                    true,
                    "ERR_ARTITLE_MOD001: Se encontraron uno o más errores.",
                    $this->responseController->makeErrors($validator->errors()->messages()),
                    401
                );
            }


            foreach ($information['DETAILS'] as $details) {
                $validator = Validator::make($details, [
                    'NO' => 'required|string',
                    'CODIGO' => 'required|string',
                    'MODELO' => 'required|string',
                    'MONEDA' => 'required|string',
                    'PRECIO' => 'required|string',
                    'MONTO_MINIMO' => 'required|string',
                    'ESTADO' => 'required|string',
                    'CARACTERISTICAS' => 'required|string',
                ]);
                if ($validator->fails()) {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_MOD002: Se encontraron uno o más errores.",
                        $this->responseController->makeErrors($validator->errors()->messages()),
                        401
                    );
                }
            }

            foreach ($information['IMAGEN'] as $key => $imagen) {
                if (gettype($imagen) != 'string') {
                    return $this->responseController->makeResponse(
                        true,
                        "ERR_ARTITLE_MOD003: Se encontraron uno o más errores.",
                        "Se se obtuvieron los ID de los archivos.",
                        401
                    );
                }
            }
        }

        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($requestData['USUARIO'], $requestData['NUMERO_LINEA']);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD004:'.$arrResponseCheckUser['msg'], [], 401);
        }
        $usuario = $arrResponseCheckUser['response'];
        
        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        $numeroArticulo = $requestData['NO'];
        try {
            $validateUpdate = DB::table('S002V01TARTI')
                ->where('ARTI_IDAR', '=', $numeroArticulo)
                ->where('ARTI_NULI', '=', $requestData['NUMERO_LINEA'])
                ->update([
                    'ARTI_CODI' => $requestData['CODIGO'],
                    'ARTI_COFA' => $requestData['FAMILIA'],
                    'ARTI_COSU' => $requestData['SUBFAMILIA'],
                    'ARTI_NOMB' => $requestData['ARTICULO'],
                    'ARTI_USMO' => $usuario,
                    'ARTI_FEMO' => $currentDate,
                    'ARTI_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
            
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD005: Ocurrió un error al modificar el registro.", $th->getMessage(), 500);
        }
        if (!$validateUpdate) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD006: Ocurrió un error al modificar en la tabla.", [], 500);
        }

        $arrInformation = $requestData['INFORMATION'];
        foreach ($arrInformation as $keyInformation => $information) {
            // Número de ID de información
            $numeroInformation = $information['NO'];

            // Se verifica si la información ya está registrado o no
            if ($information['ESTADO'] === 'Modificado' || $information['ESTADO'] === 'Activo') {
                $arrCodeImages = array();
                foreach ($information['IMAGEN'] as $key => $encIdFile) {
                    $idFile = $this->encController->decrypt($encIdFile);
                    $arrCode = explode('=', $idFile);
                    
                    if ( count($arrCode) == 3 ) {
                        
                        $arrStrucuteCode = explode("-", $arrCode[0]);
                        $nameCode = explode(".", $arrCode[2]);

                        $validateImage = DB::table('S002V01TAFAL')->where([
                            ['AFAL_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['AFAL_COMO', '=', $arrStrucuteCode['1']],
                            ['AFAL_CLDO', '=', $arrStrucuteCode['2']],
                            ['AFAL_NOAR', '=', $nameCode[0]],
                            ['AFAL_EXTE', '=', $nameCode[1]],
                        ])->orderBy('AFAL_NUVE', 'desc')->exists();

                        if (!$validateImage) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD007: : La imagen con el código $idFile no existe.", [], 500);
                        }

                        $arrCodeImages[] = $this->encController->encrypt($idFile);

                    } else {
                        $tempFile = DB::table('S002V01TARTE')->where([
                            ['ARTE_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['ARTE_IDAR', '=', $idFile],
                        ])->first();
    
                        if(is_null($tempFile)){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD008: El archivo consultado no está registrado', $idFile, 404);
                        }else if($tempFile->ARTE_ESTA == 'Eliminado'){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD009: El archivo consultado está eliminado', $tempFile, 404);
                        }

                        $fileResponse = $this->documentManagementController->moveFinalFile(
                            intval($requestData['NUMERO_LINEA']),
                            'GEAD',
                            'FO',
                            $tempFile,
                            $usuario,
                        );
    
                        if(!$fileResponse[0]){
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD010: ".$fileResponse[1], [], 400);
                        }
                        $arrCodeImages[] = $this->encController->encrypt($fileResponse[1]);
                        // $arrCodeImages[] = $fileResponse[1];
                    }
                }
                $jsonImages = json_encode($arrCodeImages);

                try {
                    $validate = DB::table('S002V01TDEAR')->where('DEAR_IDDE', '=', $numeroInformation)->update([
                        'DEAR_DESC' => $information['DESCRIPCION'],
                        'DEAR_CARA' => $information['CARACTERISTICAS'],
                        'DEAR_COWE' => $information['COMPRA_WEB'],
                        'DEAR_IDUN' => $information['TIPO_UNIDAD'],
                        'DEAR_IMAG' => $jsonImages,
                        'DEAR_NUPR' => $information['PROVEEDOR'],
                        'DEAR_USMO' => $usuario,
                        'DEAR_FEMO' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                    ]);
                    
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD011: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
                }
                if (!$validate) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD012: Ocurrió un error al modificar en la tabla.", [], 500);
                }

                $arrDetails = $information['DETAILS'];
                foreach ($arrDetails as $keyDetails => $details) {
                    $numeroDetails = $details['NO'];
                    if ( $details['ESTADO'] === 'Modificado' || $details['ESTADO'] === 'Activo') {
                        try {
                            $validate = DB::table('S002V01TINAR')->where('INAR_IDIN', '=', $numeroDetails)->update([
                                'INAR_CODI' => $details['CODIGO'],
                                'INAR_MODE' => $details['MODELO'],
                                'INAR_COMO' => $details['MONEDA'],
                                'INAR_PREC' => $details['PRECIO'],
                                'INAR_MOMI' => $details['MONTO_MINIMO'],
                                // 'INAR_CANT' => $details['CANTIDAD'],
                                'INAR_CARA' => $details['CARACTERISTICAS'],
                                'INAR_USMO' => $usuario,
                                'INAR_FEMO' => $currentDate,
                                'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                            ]);
                        } catch (\Throwable $th) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD013: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
                        }
                        if (!$validate) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD014: Ocurrió un error al modificar en la tabla.", [], 500);
                        }
                    } else if ($details['ESTADO'] === 'Nuevo') {
                        try {
                            $validate = DB::table('S002V01TINAR')->insertGetId([
                                'INAR_IDDE' => $numeroInformation,
                                'INAR_CODI' => $details['CODIGO'],
                                'INAR_MODE' => $details['MODELO'],
                                'INAR_COMO' => $details['MONEDA'],
                                'INAR_PREC' => $details['PRECIO'],
                                'INAR_MOMI' => $details['MONTO_MINIMO'],
                                'INAR_CARA' => $details['CARACTERISTICAS'],
                                'INAR_NULI' => $requestData['NUMERO_LINEA'],
                                'INAR_USRE' => $usuario,
                                'INAR_FERE' => $currentDate,
                                'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                            ]);
                        } catch (\Throwable $th) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD015: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
                        }
                        if (!$validate) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD016: Ocurrió un error al modificar en la tabla.", [], 500);
                        }
                    } else if ($details['ESTADO'] === 'Eliminado') {
                        try {
                            $validate = DB::table('S002V01TINAR')->where('INAR_IDIN', '=', $numeroDetails)->update([
                                'INAR_ESTA' => 'Eliminado',
                                'INAR_USMO' => $usuario,
                                'INAR_FEMO' => $currentDate,
                                'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                            ]);
                        } catch (\Throwable $th) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD017: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
                        }
                        if (!$validate) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD018: Ocurrió un error al modificar en la tabla.", [], 500);
                        }
                    }
                }
            } else if ($information['ESTADO'] === 'Nuevo') {

                $arrCodeImages = array();
                foreach ($information['IMAGEN'] as $key => $encIdFile) {
                    $idFile = $this->encController->decrypt($encIdFile);
                    $arrCode = explode('=', $idFile);
                    if ( count($arrCode) == 3 ) {

                        $arrStrucuteCode = explode("-", $arrCode[0]);
                        $nameCode = explode(".", $arrCode[2]);

                        $validateImage = DB::table('S002V01TAFAL')->where([
                            ['AFAL_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['AFAL_COMO', '=', $arrStrucuteCode['1']],
                            ['AFAL_CLDO', '=', $arrStrucuteCode['2']],
                            ['AFAL_NOAR', '=', $nameCode[0]],
                            ['AFAL_EXTE', '=', $nameCode[1]],
                        ])->orderBy('AFAL_NUVE', 'desc')->exists();

                        if (!$validateImage) {
                            DB::rollBack();
                            return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD019: La imagen con el código $idFile no existe.", [], 500);
                        }

                        $arrCodeImages[] = $this->encController->encrypt($idFile);

                    } else {
                        $tempFile = DB::table('S002V01TARTE')->where([
                            ['ARTE_NULI', '=', $requestData['NUMERO_LINEA']],
                            ['ARTE_IDAR', '=', $idFile],
                        ])->first();
    
                
                        if(is_null($tempFile)){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD020: El archivo consultado no está registrado', [], 404);
                        }else if($tempFile->ARTE_ESTA == 'Eliminado'){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD021: El archivo consultado está eliminado', [], 404);
                        }
    
                        $fileResponse = $this->documentManagementController->moveFinalFile(
                            intval($requestData['NUMERO_LINEA']),
                            'GEAD',
                            'FO',
                            $tempFile,
                            $usuario,
                        );
    
                        if(!$fileResponse[0]){
                            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_MOD022: '.$fileResponse[1], [], 400);
                        }
    
                        $arrCodeImages[] = $this->encController->encrypt($fileResponse[1]);
                    }
                }
                $jsonImages = json_encode($arrCodeImages);

                try {
                    $numeroInformation = DB::table('S002V01TDEAR')->insertGetId([
                        'DEAR_DESC' => $information['DESCRIPCION'],
                        'DEAR_CARA' => $information['CARACTERISTICAS'],
                        'DEAR_COWE' => $information['COMPRA_WEB'],
                        'DEAR_IDUN' => $information['TIPO_UNIDAD'],
                        'DEAR_IMAG' => $jsonImages,
                        'DEAR_NUPR' => $information['PROVEEDOR'],
                        'DEAR_IDAR' => $numeroArticulo,
                        'DEAR_NULI' => $requestData['NUMERO_LINEA'],
                        'DEAR_USRE' => $usuario,
                        'DEAR_FERE' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                    ]);
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD023: Ocurrió un error al insertar los datos de la información del artículo.", $th->getMessage(), 500);
                }
                $arrDetails = $information['DETAILS'];
                foreach ($arrDetails as $keyDetails => $details) {
                    try {
                        DB::table('S002V01TINAR')->insertGetId([
                            'INAR_IDDE' => $numeroInformation,
                            'INAR_CODI' => $details['CODIGO'],
                            'INAR_MODE' => $details['MODELO'],
                            'INAR_COMO' => $details['MONEDA'],
                            'INAR_PREC' => $details['PRECIO'],
                            'INAR_MOMI' => $details['MONTO_MINIMO'],
                            'INAR_CARA' => $details['CARACTERISTICAS'],
                            'INAR_NULI' => $requestData['NUMERO_LINEA'],
                            'INAR_USRE' => $usuario,
                            'INAR_FERE' => $currentDate,
                            'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP')
                        ]);
                    } catch (\Throwable $th) {
                        DB::rollBack();
                        return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD024: Ocurrió un error al insertar los datos de los detalles del artículo.", $th->getMessage(), 500);
                    }
                }
            } else if ($information['ESTADO'] === 'Eliminado') {
                try {
                    $validate = DB::table('S002V01TDEAR')->where('DEAR_IDDE', '=', $numeroInformation)->update([
                        'DEAR_ESTA' => 'Eliminado',
                        'DEAR_USMO' => $usuario,
                        'DEAR_FEMO' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                    ]);                    
                } catch (\Throwable $th) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD025: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
                }
                if (!$validate) {
                    DB::rollBack();
                    return $this->responseController->makeResponse(true, "ERR_ARTITLE_MOD026: Ocurrió un error al modificar en la tabla.", [], 500);
                }
            }
        }

        DB::commit(); # Para guardar los cambios en la base de datos
        return $this->responseController->makeResponse(false, "ÉXITO: Modificación Exitosa");
    }

    public function deleteArtitle(Request $request) {
        $validator = Validator::make($request->all(), [
            'NUMERO_ARTITULO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
            'USUARIO' => 'required|string',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_DEL000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }


        DB::beginTransaction();
        $requestData = $request->all();


        $arrResponseCheckUser = $this->resourcesController->checkUserEnc($requestData['USUARIO'], $requestData['NUMERO_LINEA']);
        if ($arrResponseCheckUser['error']) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, 'ERR_ARTITLE_DEL001:'.$arrResponseCheckUser['msg'], [], 401);
        }
        $usuario = $arrResponseCheckUser['response'];


        try {
            $artitleNumber = $this->encController->decrypt($requestData['NUMERO_ARTITULO']);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(
                true, 
                "ERR_ARTITLE_DEL002: Ocurrió un error al modificar el registro.", 
                $th->getMessage(), 
                500
            );
        }

        $now = $this->functionsController->now();
        $currentDate = $now->toDateTimeString();

        try {
            $validateUpdate = DB::table('S002V01TARTI')
                ->where('ARTI_IDAR', '=', $artitleNumber)
                ->where('ARTI_NULI', '=', $requestData['NUMERO_LINEA'])
                ->update([
                    'ARTI_ESTA' => 'Eliminado',
                    'ARTI_USMO' => $usuario,
                    'ARTI_FEMO' => $currentDate,
                    'ARTI_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL003: Ocurrió un error al modificar el registro.", $th->getMessage(), 500);
        }
        if (!$validateUpdate) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL004: Ocurrió un error al modificar en la tabla.", [], 500);
        }


        try {
            $arrDescription = DB::table('S002V01TDEAR')
                ->where('DEAR_IDAR', '=', $artitleNumber)
                ->get([ 'DEAR_IDDE AS NUMERO_DESCRIPCION' ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL005: Ocurrió un error al obtener los datos de la descripción del artículo", $th->getMessage(), 500);
        }

        foreach ($arrDescription as $keyDescription => $description) {
            $numeroDescripcion = $description->NUMERO_DESCRIPCION;
            try {
                $validateUpdate = DB::table('S002V01TDEAR')
                    ->where('DEAR_IDDE', '=', $numeroDescripcion)
                    ->where('DEAR_NULI', '=', $requestData['NUMERO_LINEA'])
                    ->update([
                        'DEAR_ESTA' => 'Eliminado',
                        'DEAR_USMO' => $usuario,
                        'DEAR_FEMO' => $currentDate,
                        'DEAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                    ]);
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL007: Ocurrió un error al modificar el registro.", $th->getMessage(), 500);
            }
            if (!$validateUpdate) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL006: Ocurrió un error al modificar en la tabla.", [], 500);
            }

            try {
                $validateUpdate = DB::table('S002V01TINAR')
                    ->where('INAR_IDDE', '=', $numeroDescripcion)
                    ->where('INAR_NULI', '=', $requestData['NUMERO_LINEA'])
                    ->update([
                        'INAR_ESTA' => 'Eliminado',
                        'INAR_USMO' => $usuario,
                        'INAR_FEMO' => $currentDate,
                        'INAR_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                    ]);
            } catch (\Throwable $th) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL009: Ocurrió un error al modificar el registro.", $th->getMessage(), 500);
            }
            if (!$validateUpdate) {
                DB::rollBack();
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_DEL008: Ocurrió un error al modificar en la tabla.", [], 500);
            }
        }

        DB::commit(); # Para guardar los cambios en la base de datos
        return $this->responseController->makeResponse(false, "ÉXITO: Eliminación Exitosa");
    }

    public function generateArtitles(Request $request) {
        $validator = Validator::make($request->all(), [
            'FILE_ZIP' => 'required',
            'NUMERO_LINEA' => 'required',
            'USUARIO' => 'required',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_ARTITLE_MOD000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }
    }

    public function getArtitleByInformation($information, $user, $line) {
        try {
            $objInformation = (array) DB::table('S002V01TINAR')
                ->where('INAR_IDIN', '=', $information)
                ->where('INAR_ESTA', '=', 'Activo')
                ->where('DEAR_ESTA', '=', 'Activo')
                ->where('ARTI_ESTA', '=', 'Activo')
                ->where('FAMI_ESTA', '=', 'Activo')
                ->where('SUBF_ESTA', '=', 'Activo')
                ->where('UNID_ESTA', '=', 'Activo')
                ->where('PROV_ESTA', '=', 'Activo')
                ->join('S002V01TDEAR', 'DEAR_IDDE', '=', 'INAR_IDDE')
                ->join('S002V01TARTI', 'ARTI_IDAR', '=', 'DEAR_IDAR')
                ->join('S002V01TFAMI', 'FAMI_COFA', '=', 'ARTI_COFA')
                ->join('S002V01TSUBF', 'SUBF_COSU', '=', 'ARTI_COSU')
                ->join('S002V01TUNID', 'UNID_IDUN', '=', 'DEAR_IDUN')
                ->join('S002V01TPROV', 'PROV_NUPR', '=', 'DEAR_NUPR')
                ->join('S002V01TCAMO', 'CAMO_COMO', '=', 'INAR_COMO')
                ->first([
                    'INAR_IDIN', // Identificador de Información del artículo
                    'INAR_CODI', // Código del artículo
                    'INAR_MODE', // Modelo del artículo
                    DB::raw('CONCAT("(", CAMO_COMO, ") ", CAMO_DESC) AS CAMO_COMO'),
                    'INAR_PREC', // Precio
                    'INAR_CARA', // Características
                    'DEAR_IDDE', // Identificador de la descripción del artículo
                    'DEAR_DESC', // Descripción del artículo
                    'DEAR_CARA', // Características del artículo
                    'DEAR_COWE', // Compra web
                    'DEAR_IMAG', // Imagen
                    'DEAR_IDUN', // Identificador de la unidad
                    'UNID_NOMB', // Nombre de la unidad
                    'UNID_ACRO', // Acrónimo de la familia
                    'DEAR_NUPR', // Número del proveedor
                    'ARTI_IDAR', // Identificador del artículo
                    'ARTI_COFA', // Identificador de la familia
                    'FAMI_NOFA', // Nombre de la familia
                    'ARTI_COSU', // Identificador de la subfamilia
                    'SUBF_NOSU', // Nombre de la subfamilia
                    'ARTI_CODI', // Código del artículo
                    'ARTI_NOMB', // Nombre del artículo
                    'PROV_NOCO', // Nombre comercial
                    'PROV_NOMB', // Nombre del proveedor
                    'PROV_APPA', // Apellido paterno del proveedor
                    'PROV_APMA', // Apellido materno del proveedor
                    'PROV_CORR', // Correo electrónico
                    'PROV_LAD1', // Lada 1
                    'PROV_TEL1', // Teléfono 1
                    'PROV_LAD2', // Lada 2
                    'PROV_TEL2', // Teléfono 2
                    'PROV_XRFC', // R.F.C
                    'PROV_XTAX', // TAX ID
                    'PROV_TIPO', // Tipo
                    'PROV_SIWE', // Sitio Web
                    'PROV_MEPA', // Metodos de pago
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYINFORMATION000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }
        
        $objInformation['DEAR_IMAG'] = json_decode($objInformation['DEAR_IMAG']);
        $arrUrlImage = array();
        foreach ($objInformation['DEAR_IMAG'] as $key => $imagen) {
            $responseDocument = $this->documentManagementController->getPublicDocumentURL($imagen, $user, $line);
            $arrResponseDocument = json_decode($responseDocument->original, true);
            if ($arrResponseDocument['error']) {
                return $this->responseController->makeResponse(true, "ERR_ARTITLE_GETBYINFORMATION001: Ocurrió un error al obtener la URL de la imágen.", [], 500);
            }
            $arrUrlImage[] = $arrResponseDocument['response']['public_uri'];
        }
        $objInformation['DEAR_IMAG'] = $arrUrlImage;

        return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $objInformation);
    }
}


