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

use App\Http\Controllers\Controller;
use App\Http\Controllers\ResourcesController;
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 StockController extends Controller
{
    private $responseController;
    private $encController;
    private $resourcesController;

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

    // Crear Artículo en Stock
    public function createArtitle(Request $request) {
        $validator = Validator::make($request->all(), [
            'CODIGO_ARTICULO' => 'required|string',
            'ARTICULO' => 'required|string',
            'MODELO' => 'required|string',
            'CODIGO_MODELO' => 'required|string',
            'CODIGO_BARRA' => 'required|integer',
            'CANTIDAD' => 'required|integer',
            'STOCK_MINIMO' => 'required|integer',
            'STOCK_MAXIMO' => 'required|integer',
            'REPARALE' => 'required|string',
            'CONSUMIBLE' => 'required|string',
            'FECHA_VENCIMIENTO' => 'required|string',
            'ID_SUBCATEGORIA' => 'required|string',
            'ID_UNIDAD' => 'required|string',
            'PELIGROSO' => 'required|boolean',
            'IMAGEN' => 'required|string',
            'TASA_ROTACION' => 'required|double',
            'TIPO_ADQUISICION' => 'required|string',
            'PROVEEDOR' => 'required|string',
            'NUMERO_LINEA' => 'required|integer',
            'USUARIO' => 'required|string',
        ]);

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

        $request = $request->all();

        // Se consulta si el código existe en la base de datos
        try {
            $existCode = DB::table('S002V01TSTOC')
                ->where('STOC_CODI', '=', $request['CODIGO_ARTICULO'])
                ->where('STOC_NULI', '=', $request['NUMERO_LINEA'])
                ->exists();
        } catch(\Exception $ex) {
            return $this->responseController->makeResponse(
                true,
                "ERR_STOCK_REG001: Ocurrió un error al consultar el código del artículo.",
                $request['CODIGO_ARTITULO'],
                500
            );
        }

        // Se valida la respuesta de la consulta
        if ($existCode) {
            return $this->responseController->makeResponse(true,"ERR_STOCK_REG002: El código del artículo ya se encuentra registrado.");
        }
        $numberLine = $request['NUMERO_LINEA'];

        // Se crea y guarda la imagen
        $responseImage = $this->resourcesController->makeImage( $request['IMAGEN'], $request['MODELO'], 'jpeg', 'FO', $numberLine, 'GEIN' );
        // Se verifica que todo se encuentre en orden
        if ($responseImage['error']) {
            return $this->responseController->makeResponse( true, $responseImage['msg'], [], 500);
        }
        // Se obtiene el nombre de la imagen creada
        $nameImage = $responseImage['response'];

        // Se obtiene la fecha del día de hoy
        $currentDate = Carbon::now()->timezone('America/Mazatlan')->toDateTimeString();
        // Se obtiene el número de usuario
        $numberUser = $this->encController->decrypt($request['USUARIO']);

        // Se inicializa el objecto a insertar
        $objectInsert = [
            'STOC_CODI' => $request['CODIGO_ARTICULO'],
            'STOC_ARTI' => $request['ARTICULO'],
            'STOC_MODE' => $request['MODELO'],
            'STOC_COAR' => $request['CODIGO_MODELO'],
            'STOC_COBA' => $request['CODIGO_BARRA'],
            'STOC_CANT' => $request['CANTIDAD'],
            'STOC_STMI' => $request['STOCK_MINIMO'],
            'STOC_STMA' => $request['STOCK_MAXIMO'],
            'STOC_REPA' => $request['REPARALE'],
            'STOC_CONS' => $request['CONSUMIBLE'],
            'STOC_FEVE' => $request['FECHA_VENCIMIENTO'],
            'STOC_IDSU' => $request['ID_SUBCATEGORIA'],
            'STOC_IDUN' => $request['ID_UNIDAD'],
            'STOC_PELI' => $request['PELIGROSO'],
            'STOC_IMAG' => $nameImage,
            'STOC_TARO' => $request['TASA_ROTACION'],
            'STOC_TIAD' => $request['TIPO_ADQUISICION'],
            'STOC_PROV' => $request['PROVEEDOR'],
            'STOC_NULI' => $numberLine,
            'STOC_USRE' => $numberUser,
            'STOC_FERE' => $currentDate,
            'STOC_FEAR' => DB::raw('CURRENT_TIMESTAMP')
        ];

        // Se realiza la inserción a la base de datos
        try {
            $responseInsert = DB::table('S002V01TSTOC')->insert($objectInsert);
        } catch (\Exception $ex){
            return $this->responseController->makeResponse(
                true,
                "ERR_STOCK_REG003: Ocurrió un error al momento de insertar los datos",
                [],
                500
            );
        }

        // Se verifica que la inserción sea exitosa
        if ( $responseInsert ) {
            return $this->responseController->makeResponse(true,"ERR_STOCK_REG004: No se pudo insertar los datos",[],500);
        }

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