<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Carbon;

class CountersActivatorsController extends Controller{
    private $responseController;
    private $encryptionController;
    private $functionsController;

    public function __construct(){
        $this->responseController = new ResponseController();
        $this->encryptionController = new EncryptionController();
        $this->functionsController = new FunctionsController();
    }

    public function getActivators($idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }
        
        $activators = DB::table('S002V01TACTI')->select([
            'ACTI_IDAC AS ID_ACTIVADOR',
            'ACTI_PRIO AS PRIORIDAD',
            'ACTI_TIAC AS TIPO_ACTIVADOR',
            'ACTI_CORE AS ID_CONTADOR',
            'ACTI_ESTA AS ESTADO'
        ])->get()->all();

        foreach($activators as $key=>$activator){
            $activator->ID_ACTIVADOR = $this->encryptionController->encrypt($activator->ID_ACTIVADOR);
            $activator->ID_CONTADOR = $this->encryptionController->encrypt($activator->ID_CONTADOR);

            $activators[$key] = $activator;
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GEAC',
            'S002V01P01COAC',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó los activadores registrados.",
            $idUser,
            $nowStr,
            'S002V01S02ACTI'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $activators);
    }

    public function getActivatorsByType($type, $idUser, $line){
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }
        
        $activators = DB::table('S002V01TACTI')->select([
            'ACTI_IDAC AS IDACTIVADOR',
            'ACTI_PRIO AS PRIORIDAD',
            'ACTI_TIAC AS TIPOACTIVACION',
            'ACTI_COAC AS CONDICIONES'
        ])->where([
            ['ACTI_NULI', '=', $line],
            ['ACTI_TIAC', '=', $type]
        ])->get()->all();

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GEAC',
            'S002V01P01COAC',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó los contadores de tipo $type.",
            $idUser,
            $nowStr,
            'S002V01S02ACTI'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $activators);
    }

    public function registerActivator(Request $request){
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'priority' => 'required|string|in:1,2,3,4',
            'type' => 'required|string|in:CA,SI,ME,VA',
            'condition' => 'required|json',
            'counter' => 'required|string'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        //$priorities = ['MA' => '1', 'AL' => '2', 'ME' => '3', 'BA' => '4'];
        $types = ['CA' => 'Calendario', 'SI' => 'Sintoma', 'ME' => 'Medida', 'VA' => 'Valor'];
        $form = $request->all();

        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($form['counter']);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador relacionado no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_NULI', '=', $form['linea']],
            ['CONA_IDCO', '=', $idCounter]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador relacionado no está registrado.', [], 404);
        }

        $priority = $form['priority'];
        $type = $types[$form['type']];
        $conditionArr = json_decode($form['condition'], true);

        if(count($conditionArr) == 0){
            return $this->responseController->makeResponse(true, 'El arreglo de la condición de activación está vació.', [], 400);
        }else{
            switch($form['type']){
                case 'CA': 
                    if(count($conditionArr) != 5){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysCA = ['startDate', 'startHour', 'repeat', 'customRepeat', 'color'];
                    foreach($keysCA as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }
                break;
                case 'SI':
                    if(count($conditionArr) != 6){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysSI = ['sign', 'startDate', 'startHour', 'repeat', 'customRepeat', 'color'];
                    foreach($keysSI as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }

                    $idSymptom = $this->encryptionController->decrypt($conditionArr['sign']);
                    if(!$idSymptom){
                        return $this->responseController->makeResponse(true, 'El ID del síntoma relacionado no está encriptado correctamente.', [], 400);
                    }

                    $symptom = DB::table('S002V01TLISI')->where([
                        ['LISI_IDSI', '=', $idSymptom],
                        ['LISI_NULI', '=', $form['linea']]
                    ])->first();

                    if(is_null($symptom)){
                        return $this->responseController->makeResponse(true, 'El síntoma relacionado no está registrado.', [], 404);
                    }else if($symptom->LISI_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'El síntoma relacionado está eliminado.', [], 404);
                    }

                    $conditionArr['sign'] = $idSymptom;
                break;
                case 'ME':
                    if(count($conditionArr) != 7){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysSI = ['minValue', 'maxValue', 'magnitude', 'customMagnitude', 'unit', 'customUnit', 'color'];
                    foreach($keysSI as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }

                    $idMagnitude = $this->encryptionController->decrypt($conditionArr['magnitude']);
                    if(!$idMagnitude){
                        return $this->responseController->makeResponse(true, 'El ID de la magnitud relacionada no está encriptado correctamente.', [], 400);
                    }

                    $magnitude = DB::table('S002V01TMAGN')->where([
                        ['MAGN_NULI', '=', $form['linea']],
                        ['MAGN_IDMA', '=', $idMagnitude]
                    ])->first();

                    if(is_null($magnitude)){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada no está registrado.', [], 404);
                    }else if($magnitude->MAGN_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada está eliminada.', [], 404);
                    }

                    $idUnit = $this->encryptionController->decrypt($conditionArr['unit']);
                    if(!$idUnit){
                        return $this->responseController->makeResponse(true, 'El ID de la unidad relacionada no está encriptado correctamente.', [], 400);
                    }

                    $unit = DB::table('S002V01TLIME')->where([
                        ['LIME_IDME', '=', $idUnit],
                        ['LIME_NULI', '=', $form['linea']],
                        ['LIME_MAGN', '=', $idMagnitude],
                    ])->first();

                    if(is_null($unit)){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada no está registrado.', [], 404);
                    }else if($unit->LIME_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada está eliminada.', [], 404);
                    }

                    $conditionArr['magnitude'] = $idMagnitude ;
                    $conditionArr['unit'] = $idUnit;
                break;
                case 'VA':
                    if(count($conditionArr) != 7){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysVA = ['comparison', 'limitValue', 'magnitude', 'customMagnitude', 'unit', 'customUnit', 'color'];
                    foreach($keysVA as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }

                    $idMagnitude = $this->encryptionController->decrypt($conditionArr['magnitude']);
                    if(!$idMagnitude){
                        return $this->responseController->makeResponse(true, 'El ID de la magnitud relacionada no está encriptado correctamente.', [], 400);
                    }

                    $magnitude = DB::table('S002V01TMAGN')->where([
                        ['MAGN_NULI', '=', $form['linea']],
                        ['MAGN_IDMA', '=', $idMagnitude]
                    ])->first();

                    if(is_null($magnitude)){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada no está registrado.', [], 404);
                    }else if($magnitude->MAGN_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada está eliminada.', [], 404);
                    }

                    $idUnit = $this->encryptionController->decrypt($conditionArr['unit']);
                    if(!$idUnit){
                        return $this->responseController->makeResponse(true, 'El ID de la unidad relacionada no está encriptado correctamente.', [], 400);
                    }

                    $unit = DB::table('S002V01TLIME')->where([
                        ['LIME_IDME', '=', $idUnit],
                        ['LIME_NULI', '=', $form['linea']],
                        ['LIME_MAGN', '=', $idMagnitude],
                    ])->first();

                    if(is_null($unit)){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada no está registrado.', [], 404);
                    }else if($unit->LIME_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada está eliminada.', [], 404);
                    }

                    $conditionArr['magnitude'] = $idMagnitude ;
                    $conditionArr['unit'] = $idUnit;
                break;
                default:
                    return $this->responseController->makeResponse(true, 'El tipo de contador es inválido.', [], 400);
                break;
            }
        }

        $conditionStr = json_encode($conditionArr);
        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $idCont = DB::table('S002V01TACTI')->insertGetId([
            'ACTI_NULI' => $form['linea'],
            'ACTI_PRIO' => $priority,
            'ACTI_TIAC' => $type,
            'ACTI_COAC' => $conditionStr,
            'ACTI_CORE' => $idCounter,
            'ACTI_USRE' => $idUser,
            'ACTI_FERE' => $nowStr
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F01GEAC',
            'S002V01P02REAC',
            'Registro',
            "El usuario $name (" . $usr->USUA_IDUS . ") registró el contador #$idCont.",
            $idUser,
            $nowStr,
            'S002V01S02ACTI'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.', ['IDCONT' => $idCont]);
    }

    public function getActivator($idActivator, $idUser, $line){
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }
        
        $idActivator = $this->encryptionController->decrypt($idActivator);
        if(!$idActivator){
            return $this->responseController->makeResponse(true, 'El ID del activador solicitado no está encriptado correctamente.', [], 400);
        }
        
        $activator = DB::table('S002V01TACTI')->select([
            'ACTI_IDAC AS IDACTIVADOR',
            'ACTI_PRIO AS PRIORIDAD',
            'ACTI_TIAC AS TIPOACTIVADOR',
            'ACTI_COAC AS CONDICIONES',
            'ACTI_CORE AS CONTADOR',
            'ACTI_ESTA AS ESTADO',
            'ACTI_USRE AS USRREG',
            'ACTI_FERE AS FECREG',
            'ACTI_USMO AS USRMOD',
            'ACTI_FEMO AS FECMOD',
        ])->where([
            ['ACTI_IDAC', '=', $idActivator],
            ['ACTI_NULI', '=', $line],
        ])->first();

        if(is_null($activator)){
            return $this->responseController->makeResponse(true, 'El activador solicitado no está registrado.', [], 404);
        }

        $activator->IDACTIVADOR = $this->encryptionController->encrypt($activator->IDACTIVADOR);
        $activator->CONTADOR = $this->encryptionController->encrypt($activator->CONTADOR);
        
        $conditionsArr = json_decode($activator->CONDICIONES, true);
        foreach($conditionsArr as $key=>$val){
            $encryptedParams = ['sign', 'magnitude', 'unit'];
            if(in_array($key, $encryptedParams)){
                switch($key){
                    case 'sign':
                        $symptom = DB::table('S002V01TLISI')->where([
                            ['LISI_NULI', '=', $line],
                            ['LISI_IDSI', '=', $val]
                        ])->first();

                        $conditionsArr[$key] = $symptom->LISI_NOSI . " (" . $val . ")";
                    break;
                    case 'magnitude':
                        $magnitude = DB::table('S002V01TMAGN')->where([
                            ['MAGN_NULI', '=', $line],
                            ['MAGN_IDMA', '=', $val]
                        ])->first();

                        $conditionsArr[$key] = $magnitude->MAGN_MAGN . " (" . $val . ")";
                    break;
                    case 'unit':
                        $unit = DB::table('S002V01TLIME')->where([
                            ['LIME_NULI', '=', $line],
                            ['LIME_IDME', '=', $val]
                        ])->first();

                        $conditionsArr[$key] = $unit->LIME_NOME . " (" . $val . ") - " . $unit->LIME_ACME;
                    break;
                }
            }
        }

        $activator->CONDICIONES = json_encode($conditionsArr);
        $usrReg = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $activator->USRREG]
        ])->first();

        $nameReg = $this->functionsController->joinName($usrReg->USUA_NOMB, $usrReg->USUA_APPA, $usrReg->USUA_APMA);
        $activator->USRREG = $nameReg . " (" . $activator->USRREG . ")";

        if(!is_null($activator->USRMOD)){
            $usrMod = DB::table('S002V01TUSUA')->where([
                ['USUA_NULI', '=', $line],
                ['USUA_IDUS', '=', $activator->USRMOD]
            ])->first();
    
            $nameMod = $this->functionsController->joinName($usrMod->USUA_NOMB, $usrMod->USUA_APPA, $usrMod->USUA_APMA);
            $activator->USRMOD = $nameMod . " (" . $activator->USRMOD . ")";
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GEAC',
            'S002V01P01COAC',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó la información del activador #$idActivator",
            $idUser,
            $nowStr,
            'S002V01S02ACTI'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $activator);
    }

    public function registerCounter(Request $request) {
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'scada' => 'required|string',
            'equipment' => 'required|string',
            'time_interval' => 'required|numeric',
            'time_interval_unit' => 'required|string|in:seg,min,hor,dia',
            'time_interval_tolerance' => 'required|numeric',
            'time_interval_tolerance_unit' => 'required|string|in:seg,min,hor,dia'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        $form = $request->all();
        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idSCADA = $this->encryptionController->decrypt($form['scada']);
        if(!$idSCADA){
            return $this->responseController->makeResponse(true, 'El ID del SCADA relacionado no está encriptado correctamente.', [], 400);
        }

        $scada = DB::table('S002V01TLISC')->where([
            ['LISC_IDSC', '=', $idSCADA],
            ['LISC_NULI', '=', $form['linea']],
        ])->first();

        if(is_null($scada)){
            return $this->responseController->makeResponse(true, 'El SCADA relacionado no está registrado.', [], 404);
        }

        $equipmentCode = $this->encryptionController->decrypt($form['equipment']);
        if(!$equipmentCode){
            return $this->responseController->makeResponse(true, 'El código del equipamiento relacionado no está encriptado correctamente.', [], 400);
        }

        $equipment = DB::table('S002V01TEQUI')->where([
            ['EQUI_NULI', '=', $form['linea']],
            ['EQUI_COEQ', '=', $equipmentCode],
        ])->first();

        if(is_null($equipment)){
            return $this->responseController->makeResponse(true, 'El equipamiento relacionado no está registrado.', [], 404);
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $idCont = DB::table('S002V01TCONA')->insertGetId([
            'CONA_NULI' => $form['linea'],
            'CONA_INLE' => $form['time_interval'],
            'CONA_UTIL' => $form['time_interval_unit'],
            'CONA_TOIN' => $form['time_interval_tolerance'],
            'CONA_UTTI' => $form['time_interval_tolerance_unit'],
            'CONA_IDSC' => $idSCADA,
            'CONA_COEQ' => $equipmentCode,
            'CONA_USRE' => $idUser,
            'CONA_FERE' => $nowStr,
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P02RECO',
            'Registro',
            "El usuario $name (" . $usr->USUA_IDUS . ") registró el contador #$idCont.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.');
    }

    public function getCounters($idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $counters = DB::table('S002V01TCONA')->select([
            'CONA_IDCO AS ID_CONTADOR',
            'CONA_IDSC AS ID_SCADA',
            'LISC_NOSC AS SCADA',
            'CONA_COEQ AS CODIGO_EQUIPAMIENTO',
            'EQUI_TIPO AS TIPO_EQUIPAMIENTO',
            'EQUI_MODE AS MODELO_EQUIPAMIENTO',
            'EQUI_IDEQ AS ID_EQUIPAMIENTO',
            'CONA_ESTA AS ESTADO',
        ])->join('S002V01TLISC', 'LISC_IDSC', '=', 'CONA_IDSC')
        ->join('S002V01TEQUI', 'EQUI_COEQ', '=', 'CONA_COEQ')
        ->get()->all();

        foreach($counters as $key=>$counter){
            $activators = DB::table('S002V01TACTI')->where([
                ['ACTI_NULI', '=', $line],
                ['ACTI_CORE', '=', $counter->ID_CONTADOR]
            ])->get()->all();

            $counter->ID_CONTADOR = $this->encryptionController->encrypt($counter->ID_CONTADOR);
            $counter->ID_SCADA = $this->encryptionController->encrypt($counter->ID_SCADA);
            $counter->CODIGO_EQUIPAMIENTO = $this->encryptionController->encrypt($counter->CODIGO_EQUIPAMIENTO);
            $counter->ID_EQUIPAMIENTO = $this->encryptionController->encrypt($counter->ID_EQUIPAMIENTO);
            $counter->TIENE_ACTIVADOR = count($activators) > 0;
            $counter->ACTIVADOR = count($activators) > 0 ? $this->encryptionController->encrypt($activators[0]->ACTI_IDAC) : null;

            $counters[$key] = $counter;
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P01COCO',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó los contadores registrados.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $counters);
    }

    public function getCounter($idCounter, $idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($idCounter);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->select([
            'CONA_IDCO AS ID_CONTADOR',
            'CONA_IDSC AS ID_SCADA',
            'LISC_NOSC AS SCADA',
            'CONA_COEQ AS CODIGO_EQUIPAMIENTO',
            'EQUI_TIPO AS TIPO_EQUIPAMIENTO',
            'EQUI_MODE AS MODELO_EQUIPAMIENTO',
            'EQUI_IDEQ AS ID_EQUIPAMIENTO',
            'CONA_INLE AS INTERVALO',
            'CONA_UTIL AS UNIDAD_INTERVALO',
            'CONA_TOIN AS TOLERANCIA_INTERVALO',
            'CONA_UTTI AS UNIDAD_TOLERANCIA_INTERVALO',
            'CONA_COVI AS CONTADORES_VINCULADOS',
            'CONA_ESTA AS ESTADO',
            'CONA_USRE AS USRREG',
            'CONA_FERE AS FECREG',
            'CONA_USMO AS USRMOD',
            'CONA_FEMO AS FECMOD',
        ])->join('S002V01TLISC', 'LISC_IDSC', '=', 'CONA_IDSC')
        ->join('S002V01TEQUI', 'EQUI_COEQ', '=', 'CONA_COEQ')
        ->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $line]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador solicitado no está registrado.', [], 404);
        }

        $counter->ID_CONTADOR = $this->encryptionController->encrypt($counter->ID_CONTADOR);
        $counter->ID_SCADA = $this->encryptionController->encrypt($counter->ID_SCADA);
        $counter->CODIGO_EQUIPAMIENTO = $this->encryptionController->encrypt($counter->CODIGO_EQUIPAMIENTO);
        $counter->ID_EQUIPAMIENTO = $this->encryptionController->encrypt($counter->ID_EQUIPAMIENTO);

        $relatedCountersArr = json_decode($counter->CONTADORES_VINCULADOS, true);
        foreach($relatedCountersArr as $key=>$counterStr){
            $counterStr = $this->encryptionController->encrypt($counterStr);
            $relatedCountersArr[$key] = $counterStr;
        }

        $relatedCountersStr = json_encode($relatedCountersArr);
        $counter->CONTADORES_VINCULADOS = $relatedCountersStr;

        $usrReg = DB::table('S002V01TUSUA')->where([
            ['USUA_IDUS', '=', $counter->USRREG],
            ['USUA_NULI', '=', $line]
        ])->first();

        $nameReg = $this->functionsController->joinName($usrReg->USUA_NOMB, $usrReg->USUA_APPA, $usrReg->USUA_APMA);
        $counter->USRREG = $nameReg . " (" . $counter->USRREG . ")";

        if(!is_null($counter->USRMOD)){
            $usrMod = DB::table('S002V01TUSUA')->where([
                ['USUA_IDUS', '=', $counter->USRMOD],
                ['USUA_NULI', '=', $line]
            ])->first();
    
            $nameMod = $this->functionsController->joinName($usrMod->USUA_NOMB, $usrMod->USUA_APPA, $usrMod->USUA_APMA);
            $counter->USRMOD = $nameMod . " (" . $counter->USRMOD . ")";
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P01COCO',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó el contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $counter);
    }

    public function updateCounter(Request $request) {
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'scada' => 'required|string',
            'equipment' => 'required|string',
            'id_counter' => 'required|string',
            'time_interval' => 'required|numeric',
            'time_interval_unit' => 'required|string|in:seg,min,hor,dia',
            'time_interval_tolerance' => 'required|numeric',
            'time_interval_tolerance_unit' => 'required|string|in:seg,min,hor,dia'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        $form = $request->all();
        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idSCADA = $this->encryptionController->decrypt($form['scada']);
        if(!$idSCADA){
            return $this->responseController->makeResponse(true, 'El ID del SCADA relacionado no está encriptado correctamente.', [], 400);
        }

        $scada = DB::table('S002V01TLISC')->where([
            ['LISC_IDSC', '=', $idSCADA],
            ['LISC_NULI', '=', $form['linea']],
        ])->first();

        if(is_null($scada)){
            return $this->responseController->makeResponse(true, 'El SCADA relacionado no está registrado.', [], 404);
        }

        $equipmentCode = $this->encryptionController->decrypt($form['equipment']);
        if(!$equipmentCode){
            return $this->responseController->makeResponse(true, 'El código del equipamiento relacionado no está encriptado correctamente.', [], 400);
        }

        $equipment = DB::table('S002V01TEQUI')->where([
            ['EQUI_NULI', '=', $form['linea']],
            ['EQUI_COEQ', '=', $equipmentCode],
        ])->first();

        if(is_null($equipment)){
            return $this->responseController->makeResponse(true, 'El equipamiento relacionado no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($form['id_counter']);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador seleccionado no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_NULI', '=', $form['linea']],
            ['CONA_IDCO', '=', $idCounter]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador seleccionado no está registrado.', [], 404);
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $form['linea']]
        ])->update([
            'CONA_INLE' => $form['time_interval'],
            'CONA_UTIL' => $form['time_interval_unit'],
            'CONA_TOIN' => $form['time_interval_tolerance'],
            'CONA_UTTI' => $form['time_interval_tolerance_unit'],
            'CONA_IDSC' => $idSCADA,
            'CONA_USMO' => $idUser,
            'CONA_FEMO' => $nowStr
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P02RECO',
            'Actualización',
            "El usuario $name (" . $usr->USUA_IDUS . ") actualizó el contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.');
    }

    public function deleteCounter(Request $request) {
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'id_counter' => 'required|string'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        $form = $request->all();
        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($form['id_counter']);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador seleccionado no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_NULI', '=', $form['linea']],
            ['CONA_IDCO', '=', $idCounter]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador seleccionado no está registrado.', [], 404);
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $form['linea']]
        ])->update([
            'CONA_ESTA' => 'Eliminado',
            'CONA_USMO' => $idUser,
            'CONA_FEMO' => $nowStr
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F02ELCO',
            '-',
            'Eliminación',
            "El usuario $name (" . $usr->USUA_IDUS . ") eliminó el contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.');
    }

    public function updateActivator(Request $request) {
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'priority' => 'required|string|in:1,2,3,4',
            'type' => 'required|string|in:CA,SI,ME,VA',
            'condition' => 'required|json',
            'counter' => 'required|string',
            'id_activator' => 'required|string'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        //$priorities = ['MA' => '1', 'AL' => '2', 'ME' => '3', 'BA' => '4'];
        $types = ['CA' => 'Calendario', 'SI' => 'Sintoma', 'ME' => 'Medida', 'VA' => 'Valor'];
        $form = $request->all();

        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($form['counter']);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador relacionado no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_NULI', '=', $form['linea']],
            ['CONA_IDCO', '=', $idCounter]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador relacionado no está registrado.', [], 404);
        }

        $idActivator = $this->encryptionController->decrypt($form['id_activator']);
        if(!$idActivator){
            return $this->responseController->makeResponse(true, 'El ID del activador seleccionado no está encriptado correctamente.', [], 400);
        }

        $activator = DB::table('S002V01TACTI')->where([
            ['ACTI_IDAC', '=', $idActivator],
            ['ACTI_NULI', '=', $form['linea']]
        ])->first();

        if(is_null($activator)){
            return $this->responseController->makeResponse(true, 'El activador seleccionado no está registrado.', [], 404);
        }

        $priority = $form['priority'];
        $type = $types[$form['type']];
        $conditionArr = json_decode($form['condition'], true);

        if(count($conditionArr) == 0){
            return $this->responseController->makeResponse(true, 'El arreglo de la condición de activación está vació.', [], 400);
        }else{
            switch($form['type']){
                case 'CA': 
                    if(count($conditionArr) != 5){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysCA = ['startDate', 'startHour', 'repeat', 'customRepeat', 'color'];
                    foreach($keysCA as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }
                break;
                case 'SI':
                    if(count($conditionArr) != 6){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysSI = ['sign', 'startDate', 'startHour', 'repeat', 'customRepeat', 'color'];
                    foreach($keysSI as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }

                    $idSymptom = $this->encryptionController->decrypt($conditionArr['sign']);
                    if(!$idSymptom){
                        return $this->responseController->makeResponse(true, 'El ID del síntoma relacionado no está encriptado correctamente.', [], 400);
                    }

                    $symptom = DB::table('S002V01TLISI')->where([
                        ['LISI_IDSI', '=', $idSymptom],
                        ['LISI_NULI', '=', $form['linea']]
                    ])->first();

                    if(is_null($symptom)){
                        return $this->responseController->makeResponse(true, 'El síntoma relacionado no está registrado.', [], 404);
                    }else if($symptom->LISI_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'El síntoma relacionado está eliminado.', [], 404);
                    }

                    $conditionArr['sign'] = $idSymptom;
                break;
                case 'ME':
                    if(count($conditionArr) != 7){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysSI = ['minValue', 'maxValue', 'magnitude', 'customMagnitude', 'unit', 'customUnit', 'color'];
                    foreach($keysSI as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }

                    $idMagnitude = $this->encryptionController->decrypt($conditionArr['magnitude']);
                    if(!$idMagnitude){
                        return $this->responseController->makeResponse(true, 'El ID de la magnitud relacionada no está encriptado correctamente.', [], 400);
                    }

                    $magnitude = DB::table('S002V01TMAGN')->where([
                        ['MAGN_NULI', '=', $form['linea']],
                        ['MAGN_IDMA', '=', $idMagnitude]
                    ])->first();

                    if(is_null($magnitude)){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada no está registrado.', [], 404);
                    }else if($magnitude->MAGN_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada está eliminada.', [], 404);
                    }

                    $idUnit = $this->encryptionController->decrypt($conditionArr['unit']);
                    if(!$idUnit){
                        return $this->responseController->makeResponse(true, 'El ID de la unidad relacionada no está encriptado correctamente.', [], 400);
                    }

                    $unit = DB::table('S002V01TLIME')->where([
                        ['LIME_IDME', '=', $idUnit],
                        ['LIME_NULI', '=', $form['linea']],
                        ['LIME_MAGN', '=', $idMagnitude],
                    ])->first();

                    if(is_null($unit)){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada no está registrado.', [], 404);
                    }else if($unit->LIME_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada está eliminada.', [], 404);
                    }

                    $conditionArr['magnitude'] = $idMagnitude ;
                    $conditionArr['unit'] = $idUnit;
                break;
                case 'VA':
                    if(count($conditionArr) != 7){
                        return $this->responseController->makeResponse(true, 'El arreglo de la condición tiene un formato inválido.', [], 400);
                    }

                    $keysVA = ['comparison', 'limitValue', 'magnitude', 'customMagnitude', 'unit', 'customUnit', 'color'];
                    foreach($keysVA as $key){
                        if(!array_key_exists($key, $conditionArr)){
                            return $this->responseController->makeResponse(true, "El arreglo de la condición no contiene el elemento '$key'.", [], 400);
                        }
                    }

                    $idMagnitude = $this->encryptionController->decrypt($conditionArr['magnitude']);
                    if(!$idMagnitude){
                        return $this->responseController->makeResponse(true, 'El ID de la magnitud relacionada no está encriptado correctamente.', [], 400);
                    }

                    $magnitude = DB::table('S002V01TMAGN')->where([
                        ['MAGN_NULI', '=', $form['linea']],
                        ['MAGN_IDMA', '=', $idMagnitude]
                    ])->first();

                    if(is_null($magnitude)){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada no está registrado.', [], 404);
                    }else if($magnitude->MAGN_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La magnitud relacionada está eliminada.', [], 404);
                    }

                    $idUnit = $this->encryptionController->decrypt($conditionArr['unit']);
                    if(!$idUnit){
                        return $this->responseController->makeResponse(true, 'El ID de la unidad relacionada no está encriptado correctamente.', [], 400);
                    }

                    $unit = DB::table('S002V01TLIME')->where([
                        ['LIME_IDME', '=', $idUnit],
                        ['LIME_NULI', '=', $form['linea']],
                        ['LIME_MAGN', '=', $idMagnitude],
                    ])->first();

                    if(is_null($unit)){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada no está registrado.', [], 404);
                    }else if($unit->LIME_ESTA == 'Eliminado'){
                        return $this->responseController->makeResponse(true, 'La unidad relacionada está eliminada.', [], 404);
                    }

                    $conditionArr['magnitude'] = $idMagnitude ;
                    $conditionArr['unit'] = $idUnit;
                break;
                default:
                    return $this->responseController->makeResponse(true, 'El tipo de contador es inválido.', [], 400);
                break;
            }
        }

        $conditionStr = json_encode($conditionArr);
        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        DB::table('S002V01TACTI')->where([
            ['ACTI_IDAC', '=', $idActivator],
            ['ACTI_NULI', '=', $form['linea']]
        ])->update([
            'ACTI_PRIO' => $priority,
            'ACTI_TIAC' => $type,
            'ACTI_COAC' => $conditionStr,
            'ACTI_CORE' => $idCounter,
            'ACTI_USMO' => $idUser,
            'ACTI_FEMO' => $nowStr
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F01GEAC',
            'S002V01P02REAC',
            'Actualización',
            "El usuario $name (" . $usr->USUA_IDUS . ") actualizó el activador #$idActivator.",
            $idUser,
            $nowStr,
            'S002V01S02ACTI'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.');
    }

    public function deleteActivator(Request $request) {
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'id_activator' => 'required|string'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        $form = $request->all();
        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idActivator = $this->encryptionController->decrypt($form['id_activator']);
        if(!$idActivator){
            return $this->responseController->makeResponse(true, 'El ID del activador seleccionado no está encriptado correctamente.', [], 400);
        }

        $activator = DB::table('S002V01TACTI')->where([
            ['ACTI_IDAC', '=', $idActivator],
            ['ACTI_NULI', '=', $form['linea']]
        ])->first();

        if(is_null($activator)){
            return $this->responseController->makeResponse(true, 'El activador seleccionado no está registrado.', [], 404);
        }
        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        DB::table('S002V01TACTI')->where([
            ['ACTI_IDAC', '=', $idActivator],
            ['ACTI_NULI', '=', $form['linea']]
        ])->update([
            'ACTI_ESTA' => 'Eliminado',
            'ACTI_USMO' => $idUser,
            'ACTI_FEMO' => $nowStr
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F01GEAC',
            'S002V01P02REAC',
            'Eliminación',
            "El usuario $name (" . $usr->USUA_IDUS . ") eliminó el activador #$idActivator.",
            $idUser,
            $nowStr,
            'S002V01S02ACTI'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.');
    }

    public function getCountersByEquipment($equipmentCode, $idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $equipmentCode = $this->encryptionController->decrypt($equipmentCode);
        if(!$equipmentCode){
            return $this->responseController->makeResponse(true, 'El código del equipamiento relacionado no está encriptado correctamente.', [], 400);
        }

        $equipment = DB::table('S002V01TEQUI')->where([
            ['EQUI_COEQ', '=', $equipmentCode],
            ['EQUI_NULI', '=', $line]
        ])->first();

        if(is_null($equipment)){
            return $this->responseController->makeResponse(true, 'El equipamiento relacionado no está registrado.', [], 404);
        }

        $counters = DB::table('S002V01TCONA')->select([
            'CONA_IDCO AS ID_CONTADOR',
            'ACTI_IDAC AS ID_ACTIVADOR',
            'ACTI_PRIO AS PRIORIDAD',
            'CONA_ESTA AS ESTADO',
            'CONA_FERE AS FECREG',
            'CONA_USRE AS USRREG',
            'CONA_FEMO AS FECMOD',
            'CONA_USMO AS USRMOD'
        ])->join('S002V01TACTI', 'ACTI_CORE', '=', 'CONA_IDCO')->where([
            ['CONA_NULI', '=', $line],
            ['CONA_COEQ', '=', $equipmentCode]
        ])->orderBy('CONA_IDCO', 'asc')->get()->all();

        foreach($counters as $key=>$counter){
            $counter->ID_CONTADOR = $this->encryptionController->encrypt($counter->ID_CONTADOR);
            if(!is_null($counter->ID_ACTIVADOR)){
                $counter->ID_ACTIVADOR = $this->encryptionController->encrypt($counter->ID_ACTIVADOR);
            }

            $usrReg = DB::table('S002V01TUSUA')->where([
                ['USUA_NULI', '=', $line],
                ['USUA_IDUS', '=', $counter->USRREG]
            ])->first();

            $nameReg = $this->functionsController->joinName($usrReg->USUA_NOMB, $usrReg->USUA_APPA, $usrReg->USUA_APMA);
            $counter->USRREG = $nameReg . " (" . $counter->USRREG . ")";

            if(!is_null($counter->USRMOD)){
                $usrMod = DB::table('S002V01TUSUA')->where([
                    ['USUA_NULI', '=', $line],
                    ['USUA_IDUS', '=', $counter->USRMOD]
                ])->first();

                $nameMod = $this->functionsController->joinName($usrMod->USUA_NOMB, $usrMod->USUA_APPA, $usrMod->USUA_APMA);
                $counter->USRMOD = $nameMod . " (" . $counter->USRMOD . ")";
            }

            $counters[$key] = $counter;
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P01COCO',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó los contadores relacionados al equipamiento $equipmentCode.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $counters);
    }

    public function getCounterLastMeasure($idCounter, $idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($idCounter);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $line]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador solicitado no está registrado.', [], 404);
        }

        $measure = DB::table('S002V01TMEDI')->select([
            'MEDI_IDME AS ID_MEDIDA',
            'MEDI_CORE AS CONTADOR',
            'MEDI_VALO AS VALOR',
            'MEDI_WSRE AS ID_SERVICIO_WEB',
            'LSWE_URLX AS URL_SERVICIO_WEB',
            'MEDI_HORE AS HORA_REGISTRO',
        ])->join('S002V01TLSWE', 'LSWE_IDSW', '=', 'MEDI_WSRE')->where([
            ['MEDI_NULI', '=', $line],
            ['MEDI_CORE', '=', $idCounter]
        ])->orderBy('MEDI_HORE', 'desc')->first();

        if(!is_null($measure)){
            $measure->ID_MEDIDA = $this->encryptionController->encrypt($measure->ID_MEDIDA);
            $measure->CONTADOR = $this->encryptionController->encrypt($measure->CONTADOR);
            $measure->ID_SERVICIO_WEB = $this->encryptionController->encrypt($measure->ID_SERVICIO_WEB);
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P01COCO',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó las medidas relacionadas al contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", is_null($measure) ? [] : [$measure]);
    }

    public function getCounterMeasures($idCounter, $order, $direction, $limit, $offset, $idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($idCounter);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $line]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador solicitado no está registrado.', [], 404);
        }
        
        $enabledOrders = [
            'ID_MEDIDA' => 'MEDI_IDME',
            'VALOR' => 'MEDI_VALO',
            'FECREG' => 'MEDI_HORE'
        ];

        if(!isset($enabledOrders[$order])){
            return $this->responseController->makeResponse(true, 'El orden solicitado para los registros es inválido.', [], 404);
        }

        $orderDB = $enabledOrders[$order];
        $enbaledDirections = [
            'D' => 'desc',
            'A' => 'asc'
        ];

        if(!isset($enbaledDirections[$direction])){
            return $this->responseController->makeResponse(true, 'La dirección del orden solicitado para los registros es inválida.', [], 404);
        }

        $directionDB = $enbaledDirections[$direction];
        $limit = intval($limit);
        $offset = intval($offset);

        $measures = DB::table('S002V01TMEDI')->select([
            'MEDI_IDME AS ID_MEDIDA',
            'MEDI_CORE AS CONTADOR',
            'MEDI_VALO AS VALOR',
            'MEDI_WSRE AS ID_SERVICIO_WEB',
            'LSWE_URLX AS URL_SERVICIO_WEB',
            'MEDI_HORE AS HORA_REGISTRO',
        ])->join('S002V01TLSWE', 'LSWE_IDSW', '=', 'MEDI_WSRE')->where([
            ['MEDI_NULI', '=', $line],
            ['MEDI_CORE', '=', $idCounter]
        ])->orderBy($orderDB, $directionDB)
        ->offset($offset)->limit($limit)->get()->all();

        foreach($measures as $key=>$measure){
            $measure->ID_MEDIDA = $this->encryptionController->encrypt($measure->ID_MEDIDA);
            $measure->CONTADOR = $this->encryptionController->encrypt($measure->CONTADOR);
            $measure->ID_SERVICIO_WEB = $this->encryptionController->encrypt($measure->ID_SERVICIO_WEB);

            $measures[$key];
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P01COCO',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó las medidas relacionadas al contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", $measures);
    }

    public function getCounterMeasuresLength($idCounter, $idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($idCounter);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $line]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador solicitado no está registrado.', [], 404);
        }

        $measures = DB::table('S002V01TMEDI')->select([
            'MEDI_IDME AS ID_MEDIDA',
            'MEDI_CORE AS CONTADOR',
            'MEDI_VALO AS VALOR',
            'MEDI_WSRE AS ID_SERVICIO_WEB',
            'LSWE_URLX AS URL_SERVICIO_WEB',
            'MEDI_HORE AS HORA_REGISTRO',
        ])->join('S002V01TLSWE', 'LSWE_IDSW', '=', 'MEDI_WSRE')->where([
            ['MEDI_NULI', '=', $line],
            ['MEDI_CORE', '=', $idCounter]
        ])->get()->all();

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

        $idac = $this->functionsController->registerActivity(
            $line,
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P01COCO',
            'Consulta',
            "El usuario $name (" . $usr->USUA_IDUS . ") consultó las medidas relacionadas al contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
        return $this->responseController->makeresponse(false, "EXITO", ['MEASURES_LENGTH' => count($measures)]);
    }

    public function getRelatedCounters($idCounter, $idUser, $line) {
        DB::enableQueryLog();

        $idUser = $this->encryptionController->decrypt($idUser);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $line],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($idCounter);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $line]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador solicitado no está registrado.', [], 404);
        }
        var_dump($idCounter);
    }

    public function relateCounters(Request $request) {
        DB::enableQueryLog();

        $validator = Validator::make($request->all(), [
            'id_user' => 'required|string',
            'linea' => 'required|integer',
            'id_counter' => 'required|string',
            'related_counters' => 'required|json'
        ]);

        if($validator->fails()){
            return $this->responseController->makeResponse(
                true,
                "Se encontraron uno o más errores.",
                $this->responseController->makeErrors(
                    $validator->errors()->messages()
                ),
                401
            );
        }

        $form = $request->all();
        $idUser = $this->encryptionController->decrypt($form['id_user']);
        if(!$idUser){
            return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
        }

        $usr = DB::table('S002V01TUSUA')->where([
            ['USUA_NULI', '=', $form['linea']],
            ['USUA_IDUS', '=', $idUser],
        ])->first();

        if(is_null($usr)){
            return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
        }

        $idCounter = $this->encryptionController->decrypt($form['id_counter']);
        if(!$idCounter){
            return $this->responseController->makeResponse(true, 'El ID del contador seleccionado no está encriptado correctamente.', [], 400);
        }

        $counter = DB::table('S002V01TCONA')->where([
            ['CONA_NULI', '=', $form['linea']],
            ['CONA_IDCO', '=', $idCounter]
        ])->first();

        if(is_null($counter)){
            return $this->responseController->makeResponse(true, 'El contador seleccionado no está registrado.', [], 404);
        }

        $relatedCountersRegisteredArr = json_decode($counter->CONA_COVI, true);
        $relatedCountersArr = json_decode($form['related_counters'], true);

        if(!is_array($relatedCountersArr)){
            return $this->responseController->makeResponse(true, 'El campo de contadores vinculados no es un arreglo.', [], 400);
        }

        $now = $this->functionsController->now();
        $nowStr = $now->toDateTimeString();
        $relatedCountersArrDec = [];
        foreach($relatedCountersArr as $relatedCounterEnc){
            $relatedCounterDec = $this->encryptionController->decrypt($relatedCounterEnc);
            $relatedCounter = DB::table('S002V01TCONA')->where([
                ['CONA_IDCO', '=', $relatedCounterDec],
                ['CONA_NULI', '=', $form['linea']]
            ])->first();

            if(is_null($relatedCounter)){
                return $this->responseController->makeResponse(true, "El contador #$relatedCounterDec no está registrado.", [], 404);
            }

            if(!in_array($relatedCounter, $relatedCountersRegisteredArr)){
                $relatedCountersRegisteredArr[] = $relatedCounterDec;
            }

            $relatedCounterRelatedCountersArr = json_decode($relatedCounter->CONA_COVI);
            if(!in_array($idCounter, $relatedCounterRelatedCountersArr)){
                $relatedCounterRelatedCountersArr[] = $idCounter;
            }

            $relatedCounterCOVI = json_encode($relatedCounterRelatedCountersArr);
            DB::table('S002V01TCONA')->where([
                ['CONA_IDCO', '=', $relatedCounterDec],
                ['CONA_NULI', '=', $form['linea']]
            ])->update([
                'CONA_COVI' => $relatedCounterCOVI,
                'CONA_USMO' => $idUser,
                'CONA_FEMO' => $nowStr
            ]);

            $relatedCountersArrDec[] = $relatedCounterDec;
        }

        $countersWithRelation = DB::table('S002V01TCONA')->where('CONA_NULI', '=', $form['linea'])
        ->whereJsonContains('CONA_COVI', $idCounter)->get()->all();
        foreach($countersWithRelation as $counterWithRelation){
            if(!in_array($counterWithRelation->CONA_IDCO, $relatedCountersArrDec)){
                $counterWithRelationRelatedCounters = json_decode($counterWithRelation->CONA_COVI, true);
                $counterWithRelationRelatedCountersFn = [];
                
                foreach($counterWithRelationRelatedCounters as $counterWithRelationRelatedCounter){
                    if($idCounter != $counterWithRelationRelatedCounter){
                        $counterWithRelationRelatedCountersFn[] = $counterWithRelationRelatedCounter;
                    }
                }

                $counterWithRelationCOVI = json_encode($counterWithRelationRelatedCountersFn);
                DB::table('S002V01TCONA')->where([
                    ['CONA_IDCO', '=', $counterWithRelation->CONA_IDCO],
                    ['CONA_NULI', '=', $form['linea']]
                ])->update([
                    'CONA_COVI' => $counterWithRelationCOVI,
                    'CONA_USMO' => $idUser,
                    'CONA_FEMO' => $nowStr
                ]);
            }
        }

        $relatedCountersFn = [];
        foreach($relatedCountersRegisteredArr as $relatedCounterRegistered){
            if(in_array($relatedCounterRegistered, $relatedCountersArrDec) && !in_array($relatedCounterRegistered, $relatedCountersFn)){
                $relatedCountersFn[] = $relatedCounterRegistered;
            }
        }

        $covi = json_encode($relatedCountersFn);
        DB::table('S002V01TCONA')->where([
            ['CONA_IDCO', '=', $idCounter],
            ['CONA_NULI', '=', $form['linea']]
        ])->update([
            'CONA_COVI' => $covi,
            'CONA_USMO' => $idUser,
            'CONA_FEMO' => $nowStr
        ]);

        $actions = DB::getQueryLog();
        $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
        
        $idac = $this->functionsController->registerActivity(
            $form['linea'],
            'S002V01M06COAC',
            'S002V01F01GECO',
            'S002V01P02RECO',
            'Actualización',
            "El usuario $name (" . $usr->USUA_IDUS . ") actualizó los contadores vinculados al contador #$idCounter.",
            $idUser,
            $nowStr,
            'S002V01S01CONT'
        );

        $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
        return $this->responseController->makeResponse(false, 'EXITO.');
    }
}