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

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

class DispatchController extends Controller {

    private $responseController;
    private $encController;
    private $functionsController;

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

    public function getDispatch($user, $line) {
        try {
            $arrDispatch = DB::table('S002V01TDESP')
                ->where("DESP_NULI", "=", $line)
                ->get([
                    'DESP_IDDE', // Número de despacho
                    'DESP_NODE', // Nombre del despacho
                    'DESP_NOMB', // Nombre del despacho
                    'DESP_CALL', // Calle
                    'DESP_NUEX', // Número exterior
                    'DESP_NUIN', // Número interior
                    'DESP_COPO', // Código postal
                    'DESP_COLO', // Colonia
                    'DESP_MUNI', // Municipio
                    'DESP_ENTI', // Entidad
                    'DESP_PAIS', // Pais
                    'DESP_ESTA', // Estado
                    'DESP_USRE', // Usuario Registra
                    'DESP_FERE', // Fecha Registra
                    'DESP_USMO', // Usuario Modifica
                    'DESP_FEMO', // Fecha Modifica
                ]);
            } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

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

    public function getDispatchActive($user, $line) {
        try {
            $arrDispatch = DB::table('S002V01TDESP')
                ->where("DESP_NULI", "=", $line)
                ->get([
                    'DESP_IDDE', // Número de despacho
                    'DESP_NODE', // Nombre del despacho
                    'DESP_NOMB', // Nombre del despacho
                    'DESP_CALL', // Calle
                    'DESP_NUEX', // Número exterior
                    'DESP_NUIN', // Número interior
                    'DESP_COPO', // Código postal
                    'DESP_COLO', // Colonia
                    'DESP_MUNI', // Municipio
                    'DESP_ENTI', // Entidad
                    'DESP_PAIS', // Pais
                    'DESP_USRE', // Usuario Registra
                    'DESP_FERE', // Fecha Registra
                    'DESP_USMO', // Usuario Modifica
                    'DESP_FEMO', // Fecha Modifica
                ]);
            } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

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

    public function getDispatchById($idDispatch, $user, $line) {
        try {
            $arrDispatch = DB::table('S002V01TDESP')
                ->where("DESP_IDDE", "=", $idDispatch)
                ->where("DESP_NULI", "=", $line)
                ->where("DESP_ESTA", "=", "Activo")
                ->first([
                    'DESP_IDDE',
                    'DESP_NODE',
                    'DESP_NOMB',
                    'DESP_APPA',
                    'DESP_APMA',
                    'DESP_LADA',
                    'DESP_TELE',
                    'DESP_CORR',
                    'DESP_CALL',
                    'DESP_NUEX',
                    'DESP_NUIN',
                    'DESP_COPO',
                    'DESP_LOCA',
                    'DESP_COLO',
                    'DESP_MUNI',
                    'DESP_ENTI',
                    'DESP_PAIS',
                    'DESP_COME',
                    'DESP_USRE',
                    'DESP_FERE',
                    'DESP_USMO',
                    'DESP_FEMO',
                    'DESP_FEAR',
                ]);
        } catch (\Throwable $th) {
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_GETBYID000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
        }

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

    public function registerDispatch(Request $request) {
        $validator = Validator::make($request->all(), [
            // 'ID_DESPACHO' => 'required|string',
            'NOMBRE_DESPACHO' => 'required|string',
            'NOMBRE_RESPONSABLE' => 'required|string',
            'APELLIDO_PATERNO' => 'required|string',
            // 'APELLIDO_MATERNO' => 'required|string',
            'LADA' => 'required|string',
            'TELEFONO' => 'required|string',
            'CORREO_ELECTRONICO' => 'required|string',
            'CALLE' => 'required|string',
            'NUMERO_EXTERIOR' => 'required|string',
            // 'NUMERO_INTERIOR' => 'required|string',
            'CODIGO_POSTAL' => 'required|string',
            'COLONIA' => 'required|string',
            'LOCALIDAD' => 'required|string',
            'MUNICIPIO' => 'required|string',
            'ENTIDAD_FEDERATIVA' => 'required|string',
            'PAIS' => 'required|string',
            // 'COMENTARIOS' => 'required|string',
            'USUARIO' => 'required|string',
            'LINE_NUMBER' => 'required|string',
        ]);

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

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

        try {
            $user = $this->encController->decrypt($requestData['USUARIO']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_REG001: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
        }

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

        try {
            $responseRequest = DB::table('S002V01TDESP')->insert([
                'DESP_NULI' => $requestData['LINE_NUMBER'],
                'DESP_NODE' => $requestData['NOMBRE_DESPACHO'],
                'DESP_NOMB' => $requestData['NOMBRE_RESPONSABLE'],
                'DESP_APPA' => $requestData['APELLIDO_PATERNO'],
                'DESP_APMA' => $requestData['APELLIDO_MATERNO'],
                'DESP_LADA' => $requestData['LADA'],
                'DESP_TELE' => $requestData['TELEFONO'],
                'DESP_CORR' => $requestData['CORREO_ELECTRONICO'],
                'DESP_CALL' => $requestData['CALLE'],
                'DESP_NUEX' => $requestData['NUMERO_EXTERIOR'],
                'DESP_NUIN' => $requestData['NUMERO_INTERIOR'],
                'DESP_COPO' => $requestData['CODIGO_POSTAL'],
                'DESP_COLO' => $requestData['COLONIA'],
                'DESP_LOCA' => $requestData['LOCALIDAD'],
                'DESP_MUNI' => $requestData['MUNICIPIO'],
                'DESP_ENTI' => $requestData['ENTIDAD_FEDERATIVA'],
                'DESP_PAIS' => $requestData['PAIS'],
                'DESP_COME' => $requestData['COMENTARIOS'],
                'DESP_USRE' => $user,
                'DESP_FERE' => $currentDate,
                'DESP_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
            ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_REG002: Ocurrió un error al momento de insertar los datos en la base de datos.", $th->getMessage(), 500);
        }

        if ( !$responseRequest ) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_REG003: Ocurrió un error al insertar el despacho", [], 500);
        }

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

    public function updateDispatch(Request $request) {

        $validator = Validator::make($request->all(), [
            'ID_DESPACHO' => 'required|string',
            'NOMBRE_DESPACHO' => 'required|string',
            'NOMBRE_RESPONSABLE' => 'required|string',
            'APELLIDO_PATERNO' => 'required|string',
            // 'APELLIDO_MATERNO' => 'required|string',
            'LADA' => 'required|string',
            'TELEFONO' => 'required|string',
            'CORREO_ELECTRONICO' => 'required|string',
            'CALLE' => 'required|string',
            'NUMERO_EXTERIOR' => 'required|string',
            // 'NUMERO_INTERIOR' => 'required|string',
            'CODIGO_POSTAL' => 'required|string',
            'COLONIA' => 'required|string',
            'LOCALIDAD' => 'required|string',
            'MUNICIPIO' => 'required|string',
            'ENTIDAD_FEDERATIVA' => 'required|string',
            'PAIS' => 'required|string',
            // 'COMENTARIOS' => 'required|string',
            'USUARIO' => 'required|string',
            'LINE_NUMBER' => 'required|string',
        ]);
        if ($validator->fails()) {
            return $this->responseController->makeResponse(
                true,
                "ERR_DISPATCH_UPD000: Se encontraron uno o más errores.",
                $this->responseController->makeErrors($validator->errors()->messages()),
                401
            );
        }
        
        DB::beginTransaction();
        $requestData = $request->all();

        try {
            $user = $this->encController->decrypt($requestData['USUARIO']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_UPD001: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
        }

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

        try {
            $responseRequest = DB::table('S002V01TDESP')
                ->where('DESP_IDDE', '=', $requestData['ID_DESPACHO'],)
                ->where('DESP_NULI', '=', $requestData['LINE_NUMBER'])
                ->update([
                    'DESP_NODE' => $requestData['NOMBRE_DESPACHO'],
                    'DESP_NOMB' => $requestData['NOMBRE_RESPONSABLE'],
                    'DESP_APPA' => $requestData['APELLIDO_PATERNO'],
                    'DESP_APMA' => $requestData['APELLIDO_MATERNO'],
                    'DESP_LADA' => $requestData['LADA'],
                    'DESP_TELE' => $requestData['TELEFONO'],
                    'DESP_CORR' => $requestData['CORREO_ELECTRONICO'],
                    'DESP_CALL' => $requestData['CALLE'],
                    'DESP_NUEX' => $requestData['NUMERO_EXTERIOR'],
                    'DESP_NUIN' => $requestData['NUMERO_INTERIOR'],
                    'DESP_COPO' => $requestData['CODIGO_POSTAL'],
                    'DESP_LOCA' => $requestData['LOCALIDAD'],
                    'DESP_COLO' => $requestData['COLONIA'],
                    'DESP_MUNI' => $requestData['MUNICIPIO'],
                    'DESP_ENTI' => $requestData['ENTIDAD_FEDERATIVA'],
                    'DESP_PAIS' => $requestData['PAIS'],
                    'DESP_COME' => $requestData['COMENTARIOS'],
                    'DESP_USMO' => $user,
                    'DESP_FEMO' => $currentDate,
                    'DESP_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_UPD002: Ocurrió un error al momento de modificar los datos en la base de datos.", $th->getMessage(), 500);
        }

        if ( !$responseRequest ) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_UPD003: Ocurrió un error al modificar el despacho", [], 500);
        }

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

    public function deleteDispatch(Request $request) {
        $validator = Validator::make($request->all(), [
            'ID_DESPACHO' => 'required|string',
            'USUARIO' => 'required|string',
            'NUMERO_LINEA' => 'required|string',
        ]);

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

        DB::beginTransaction();

        $requestData = $request->all();

        try {
            $user = $this->encController->decrypt($requestData['USUARIO']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_DEL001: Ocurrió un error al obtener el contenido.", $th->getMessage(), 500);
        }

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

        try {
            $responseRequest = DB::table('S002V01TDESP')
                ->where('DESP_IDDE', '=', $requestData['ID_DESPACHO'],)
                ->where('DESP_NULI', '=', $requestData['NUMERO_LINEA'])
                ->update([
                    'DESP_ESTA' => 'Eliminado',
                    'DESP_USMO' => $user,
                    'DESP_FEMO' => $currentDate,
                    'DESP_FEAR' => DB::raw('CURRENT_TIMESTAMP'),
                ]);
        } catch (\Throwable $th) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_DEL002: Ocurrió un error al momento de eliminar los datos en la base de datos.", $th->getMessage(), 500);
        }

        if ( !$responseRequest ) {
            DB::rollBack();
            return $this->responseController->makeResponse(true, "ERR_DISPATCH_DEL003: Ocurrió un error al eliminar el despacho", [], 500);
        }

        DB::commit();
        return $this->responseController->makeResponse(false, "ÉXITO: Eliminación Exitosa");
    }
}
