<?php

namespace Daite\Coopdigital\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

use Daite\Coopdigital\Mail\CorreoInicioSesion;

// * Base de datos
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;


class ControladorInicioSesion extends Controller {

    public function inicioSesion(Request $request) {

        return view('coopdigital::autenticacion.inicio');

    }

    public function iniciarSesion(Request $request) {
        Log::info("INICIAR SESION");

        // + Condición ternaria para identificar
        // + si la petición proviene de una API
        // + y asignar su referencia
        $tipoPeticion = ($request->is('api/*')) ? 'MOVIL' : 'WEB';

        $validacion = Validator::make($request->all(), [
            'usuario' => 'required',
            'contrasena' => 'required'
        ], [
            'usuario.required' => '¡Tienes que ingresar un usuario válido!',
            'contrasena.required' => '¡Tienes que ingresar una contraseña válida!'
        ]);

        if ($validacion->fails()) {

            $errorCredencialesInvalidas = ($tipoPeticion == 'MOVIL')
            ?
            response()->json([
                'title'=>'Login incorrecto',
                'message'=>$validacion->errors()->first()
            ], 401)
            :
            back()->with(
                'fail',
                $validacion->errors()->first()
            )
            ;

            return $errorCredencialesInvalidas;

        }

        $consulta =
        "
        SELECT
        codigo,
        nombre,
        correo,
        cedula,
        realiza_transferencias_desde_app,
        enviar_notificacion_login,
        directivo,
        activado_uso_web
        FROM
        [appmovil].[usuarios]
        WHERE
        login_usuario = '{$request -> usuario}'
        AND clave = '{$request -> contrasena}'
        AND tipo_usuario = 'CLIENTE'
        ";

        $datosUsuario = collect(DB::select($consulta)) -> first();

        $pin = DB::table('dbo.tarjetas')
        ->where('identificacion', '=', str_replace('-', '', $datosUsuario->cedula??''))
        ->value('pin');

        // ! Condición para verificar
        // ! si las credenciales de
        // ! autenticación son inválidas
        if(empty($datosUsuario)) {

            // + Condición ternaria para identificar
            // + si la petición proviene de la API y
            // + asignar el retornor de error sobre las
            // + credenciales inválidas
            $errorCredencialesInvalidas = ($tipoPeticion == 'MOVIL')
            ?
            response()->json([
                'title'=>'Login incorrecto',
                'message'=>'Las credenciales son inválidas'
            ], 401)
            :
            back()->with(
                'fail',
                '¡Usuario y/o contraseña inválidos!'
            )
            ;

            // + Condición cortocircuito para identificar
            // + si la petición proviene de la WEB y
            // + mantener el usuario inválido de la
            // + autenticación
            $tipoPeticion == 'WEB' && $request->flashOnly(['usuario']);

            // + Retornando el error sobre las
            // + credenciales inválidas
            return $errorCredencialesInvalidas;

        }

        //! Validando que el usuario esté activo
        Log::info($datosUsuario->activado_uso_web);
        if(!$datosUsuario->activado_uso_web) {
            Log::info("DESACTIVADO");
            $errorCredencialesInvalidas = ($tipoPeticion == 'MOVIL')
            ?
            response()->json([
                'title'=>'No autorizado',
                'message'=>'Contacte con la sucursal de su preferencia para que le autoricen el acceso a la aplicación'
            ], 401)
            :
            back()->with(
                'fail',
                'Usuario desactivado'
            )
            ;

            // + Condición cortocircuito para identificar
            // + si la petición proviene de la WEB y
            // + mantener el usuario inválido de la
            // + autenticación
            $tipoPeticion == 'WEB' && $request->flashOnly(['usuario']);

            return $errorCredencialesInvalidas;
        }

        if (trim($datosUsuario->correo) && $datosUsuario->enviar_notificacion_login) {

            date_default_timezone_set('America/Santo_Domingo');
            $hora = date("d/m/Y h:i A");

            $datosCorreo = [

                'nombreUsuario' => $request->usuario,
                'correo' => trim($datosUsuario->correo),
                'hora' => $hora,

            ];

            Mail::to($request->correo)->send(new CorreoInicioSesion($datosCorreo));

        }

        //Guardando la sesión y redireccionando al panel de inicio
        $consulta = "EXEC [appmovil].[p_guarda_session] '{$datosUsuario -> codigo}', '{$request->ip()}', 'WEB';";
        DB::unprepared($consulta);
        $tipoPeticion == 'WEB' && $request->session()->put('usuarioIniciado', [
            'id' => $datosUsuario->codigo,
            'usuario' => $request->usuario,
            'nombre' => $datosUsuario -> nombre,
            'cedula' => $datosUsuario -> cedula,
            'correo' => $datosUsuario -> correo,
            'pin' => $pin,
            'directivo' => $datosUsuario -> directivo ? 'DIRECTIVO' : 'USUARIO',
            'realizaTransferencia' => $datosUsuario->realiza_transferencias_desde_app]);

        // ! Condición ternaria para identificar
        // ! si la consulta proviene de la API y
        // ! retornar los datos o la vista
        return ($tipoPeticion == 'MOVIL') ?
        $datosUsuario :
        redirect()->route('panel.inicio');

    }

    public function cerrarSesion() {

        if (session() -> has('usuarioIniciado')) {

            session() -> pull('usuarioIniciado');

        }

        return redirect() -> route('inicioSesion');

    }

}
