<?php

namespace App\Http\Controllers;

// Controladores
use App\Http\Controllers\Controller;
use App\Http\Controllers\RolController;
use App\Http\Controllers\LaboratorioController;

// Historicos
use App\Http\Historico\UsuarioHistorico;

// Modelos
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Usuario;

// Requests
use Illuminate\Http\Request;
use App\Http\Requests\UsuarioRequest;
use App\Http\Requests\UsuarioAsignationLabRequest;

use Auth;
use Exception;

class UsuarioController extends Controller
{

    protected $tableUsua;
    protected $historico;

    public function __construct()
    {
        $this->tableUsua = new Usuario();
    }

    public function section()
    {
        $user = Auth::user();

        if ($user->rol_id_rol == 5) {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "super_admin.name as cliente",
                    "usuario.nit",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->join("super_admin", 'super_admin.id', '=', 'usuario.super_admin_id')
                ->where("usuario.id_usuario", "<>", $user->id_usuario)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        } else {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "super_admin.name as cliente",
                    "usuario.nit",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->join("super_admin", 'super_admin.id', '=', 'usuario.super_admin_id')
                ->where('super_admin.id', '=', Auth::user()->super_admin_id)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        } /*else {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->where("rol.id_rol", $user->rol_id_rol)
                ->where("usuario.id_usuario", "<>", $user->id_usuario)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        }*/

        $roles = RolController::list();
        $client = SuperUsuarioController::list();
        $laboratorios = LaboratorioController::listAll();

        return view("usuario.usuarioSection")
            ->with("usuarios", $usuarios)
            ->with("laboratorios", $laboratorios)
            ->with("roles", $roles)
            ->with("clients", $client)
            ->with("super_admin_id", $user->super_admin_id)
            ->with("rol_usuario", $user->rol_id_rol)
            ->with("nomSection", "SeeSectionUsuario")
            ->with("laboratoriosAsignados", []);
    }


    public function index()
    {
        $user = Auth::user();
        if ($user->rol_id_rol == 5) {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "super_admin.name as cliente",
                    "usuario.nit",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->join("super_admin", 'super_admin.id', '=', 'usuario.super_admin_id')
                ->where("usuario.id_usuario", "<>", $user->id_usuario)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        } else {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "super_admin.name as cliente",
                    "usuario.nit",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->join("super_admin", 'super_admin.id', '=', 'usuario.super_admin_id')
                ->where('super_admin.id', '=', Auth::user()->super_admin_id)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        } /*else {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->where("rol.id_rol", $user->rol_id_rol)
                ->where("usuario.id_usuario", "<>", $user->id_usuario)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        }*/
        /* $usuarios = $this->tableUsua */
        /*     ->select( */
        /*         "usuario.id_usuario as id_usuario", */
        /*         "usuario.nit", */
        /*         "super_admin.name as cliente", */
        /*         "rol.nom_rol as rol", */
        /*         "usuario.nombres as nombres", */
        /*         "usuario.apellidos as apellidos", */
        /*         "usuario.nom_usuario as nom_usuario", */
        /*         "usuario.correo as correo", */
        /*         "usuario.estado as estado" */
        /*     ) */
        /*     ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol') */
        /*     ->join("super_admin", 'super_admin.id', '=', 'usuario.super_admin_id') */
        /*     ->where('super_admin.id', '=', Auth::user()->super_admin_id) */
        /*     ->orderBy("usuario.estado", "desc") */
        /*     ->orderBy("usuario.nom_usuario", "desc") */
        /*     ->get(); */

        return view("usuario.usuarioIndex")
            ->with("usuarios", $usuarios)
            ->with("laboratoriosAsignados", []);
    }


    public function modalStorePass(Request $req)
    {
        $usuario = self::listItem($req->id_reference);
        return view("usuario.usuarioUpdatePass")
            ->with("usuario", $usuario);
    }


    public function show(Request $req)
    {
        $usuario = $this->tableUsua
            ->select(
                "usuario.id_usuario as id_usuario",
                "rol.nom_rol as rol",
                "usuario.nit",
                "usuario.nombres as nombres",
                "usuario.apellidos as apellidos",
                "usuario.nom_usuario as nom_usuario",
                "usuario.correo as correo",
                "usuario.estado as estado"
            )
            ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
            ->orderBy("usuario.estado", "desc")
            ->orderBy("usuario.nom_usuario", "desc")
            ->where("id_usuario", $req->id)
            ->first();

        return view("usuario.usuarioShow")
            ->with("usuario", $usuario)
            ->with("campo", $req->campo);
    }


    public function indexAsignationLaboratorio(Request $req)
    {
        if (Auth::user()->rol_id_rol == 5) {
            $laboratoriosAsignados = $this->tableUsua
                ->select(
                    "usuario_laboratorio.id_usuario_laboratorio as id_usuario_laboratorio",
                    "laboratorio.no_laboratorio as no_laboratorio",
                    "laboratorio.nom_laboratorio as nom_laboratorio"
                )
                ->join("usuario_laboratorio", "usuario.id_usuario", "=", "usuario_laboratorio.usuario_id_usuario")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "usuario_laboratorio.laboratorio_id_laboratorio")
                ->orderBy("laboratorio.no_laboratorio", "asc")
                ->where("usuario_laboratorio.usuario_id_usuario", "=", $req->idFilter)
                ->get();
        } else {
            $laboratoriosAsignados = $this->tableUsua
                ->select(
                    "usuario_laboratorio.id_usuario_laboratorio as id_usuario_laboratorio",
                    "laboratorio.no_laboratorio as no_laboratorio",
                    "laboratorio.nom_laboratorio as nom_laboratorio"
                )
                ->join("usuario_laboratorio", "usuario.id_usuario", "=", "usuario_laboratorio.usuario_id_usuario")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "usuario_laboratorio.laboratorio_id_laboratorio")
                ->join("super_admin", 'super_admin.id', '=', 'laboratorio.super_admin_id')
                ->where('super_admin.id', '=', Auth::user()->super_admin_id)
                ->where('usuario.super_admin_id', "=", "super_admin.id")
                ->orderBy("laboratorio.no_laboratorio", "asc")
                ->where("usuario_laboratorio.usuario_id_usuario", "=", $req->idFilter)
                ->get();
        }

        return view("usuario.usuarioIndexAsignationLaboratorios")
            ->with("laboratoriosAsignados", $laboratoriosAsignados);
    }


    public function store(UsuarioRequest $req){

        $user = Auth::user();
        $client = DB::table("super_admin")
            ->where("id", $req->super_admin_id)
            ->first();
        $users = DB::table("usuario")
            ->where("super_admin_id", $user->super_admin_id)
            ->count();
/*        abort(403,"Error validando la data");*/

        if ($users <= $client->num_user) {

            $this->historico = new UsuarioHistorico();
            $this->historico->store("store", $req);

            $super_admin_id = null;
            if(isset($req->super_admin_id)) {
                $super_admin_id = $req->super_admin_id;
            } else {
                $super_admin_id = $user->super_admin_id;
            }

            DB::table("usuario")->insert(
                array(
                    "rol_id_rol" => $req->id_rol,
                    "nom_usuario" => $req->nom_usuario,
                    "nit" => $req->nit,
                    "nombres" => $req->nombres,
                    "apellidos" => $req->apellidos,
                    "correo" => $req->correo,
                    "password" => Hash::make($req->password),
                    "super_admin_id" => $super_admin_id
                )
            );
        } else {
            throw new Exception('División por cero.');
        }


    }

    public function storePass(UsuarioRequest $req)
    {
        $this->historico = new UsuarioHistorico();
        $this->historico->store("storePass", $req);

        $usuario = $this->tableUsua
            ->where("id_usuario", $req->id)
            ->first();

        $usuario->update(["password" => Hash::make($req->password)]);
    }


    public function storeAsignationLab(UsuarioAsignationLabRequest $req)
    {

        $this->historico = new UsuarioHistorico();
        $this->historico->store("storeAsignationLab", $req);

        for ($i = 0; $i < sizeof($req->id_laboratorio); $i++) {
            DB::table("usuario_laboratorio")->insert(
                array(
                    "usuario_id_usuario" => $req->id_usuario,
                    "laboratorio_id_laboratorio" => $req->id_laboratorio[$i]
                )
            );
        }
    }


    public static function list()
    {
        $tableUsua = new Usuario();
        return $tableUsua
            ->where("estado", 1)
            ->orderBy("nom_usuario", "asc")
            ->get();
    }


    public static function listLaboratorios($id_usuario, $tipo_retorno, $columna_retorno)
    {

        $tableUsua = new Usuario();
        if (Auth::user()->rol_id_rol == 5) {
            $qry = $tableUsua
                ->join("usuario_laboratorio", "usuario.id_usuario", "=", "usuario_laboratorio.usuario_id_usuario")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "usuario_laboratorio.laboratorio_id_laboratorio")
                ->get();
        } else {
            $qry = $tableUsua
                ->join("usuario_laboratorio", "usuario.id_usuario", "=", "usuario_laboratorio.usuario_id_usuario")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "usuario_laboratorio.laboratorio_id_laboratorio")
                ->where("usuario.id_usuario", "=", $id_usuario)->get();
        }

        if ($tipo_retorno == "array") {
            return array_column($qry->toArray(), $columna_retorno);
        } else {
            return $qry;
        }
    }


    public function listHTML()
    {
        $user = Auth::user();
        /*
                $usuarios = $this->tableUsua
                    ->where("estado", 1)
                    ->orderBy("nom_usuario", "asc")
                    ->get();*/

        if ($user->rol_id_rol == 5) {

            $usuarios = $this->tableUsua
                ->where("estado", 1)
                ->orderBy("nom_usuario", "asc")
                ->get();

        } else {
            $usuarios = $this->tableUsua
                ->select(
                    "usuario.id_usuario as id_usuario",
                    "super_admin.name as cliente",
                    "usuario.nit",
                    "rol.nom_rol as rol",
                    "usuario.nombres as nombres",
                    "usuario.apellidos as apellidos",
                    "usuario.nom_usuario as nom_usuario",
                    "usuario.correo as correo",
                    "usuario.estado as estado"
                )
                ->join('rol', 'usuario.rol_id_rol', '=', 'rol.id_rol')
                ->join("super_admin", 'super_admin.id', '=', 'usuario.super_admin_id')
                ->where('super_admin.id', '=', Auth::user()->super_admin_id)
                ->orderBy("usuario.estado", "desc")
                ->orderBy("usuario.nom_usuario", "desc")
                ->get();
        }


        return view("usuario.usuarioList")
            ->with("usuarios", $usuarios);
    }


    public function destroy(Request $req)
    {

        $this->historico = new UsuarioHistorico();
        $this->historico->store("destroy", $req);

        $this->tableUsua
            ->where("id_usuario", $req->id)
            ->delete();
    }


    public function destroyAsignationLab(Request $req)
    {

        $this->historico = new UsuarioHistorico();
        $this->historico->store("destroyAsignationLab", $req);

        DB::table("usuario_laboratorio")
            ->where("id_usuario_laboratorio", "=", $req->id)
            ->delete();
    }


    public static function listItem($id_usuario)
    {
        $tableUsua = new Usuario();
        return $tableUsua
            ->where("id_usuario", $id_usuario)
            ->first();
    }


    public static function listByAsignacionUsuario($id_conexion)
    {
        $tableUsua = new Usuario();
        return $tableUsua
            ->join("usuario_laboratorio", "id_usuario", "=", "usuario_id_usuario")
            ->where("id_usuario_laboratorio", $id_conexion)
            ->first();
    }


    public function status(Request $req)
    {
        $this->historico = new UsuarioHistorico();
        $this->historico->store("status", $req);

        $statusNow = self::listItem($req->id)->estado;
        $registroUpdate = $this->tableUsua->where("id_usuario", $req->id);

        if ($statusNow == 1) {
            $registroUpdate->update(["estado" => 0]);
        } else {
            $registroUpdate->update(["estado" => 1]);
        }
    }


    public function edit(Request $req)
    {

        $usuario = $this->tableUsua
            ->where("id_usuario", $req->id)
            ->first();

        switch ($req->campo) {
            case "rol":
                $roles = RolController::list();
                return view("usuario.usuarioEdit")
                    ->with("roles", $roles)
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            case "nombres":
                return view("usuario.usuarioEdit")
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            case "apellidos":
                return view("usuario.usuarioEdit")
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            case "nom_usuario":
                return view("usuario.usuarioEdit")
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            case "password":
                return view("usuario.usuarioEdit")
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            case "correo":
                return view("usuario.usuarioEdit")
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            case "nit":
                return view("usuario.usuarioEdit")
                    ->with("campo", $req->campo)
                    ->with("usuario", $usuario);
                break;

            default:
                abort(500, "Opción de modificación no encontrada");
                break;
        }
    }


    public function update(UsuarioRequest $req)
    {

        $this->historico = new UsuarioHistorico();
        $this->historico->store("update", $req);

        $usuario = $this->tableUsua
            ->where("id_usuario", $req->id)
            ->first(); // Se selecciona la institucion a la cual se desea realizar la actualización

        switch ($req->campo) {
            case "rol":
                $usuario->update(["rol_id_rol" => $req->id_rol]);
                break;

            case "nombres":
                $usuario->update(["nombres" => $req->nombres]);
                break;

            case "apellidos":
                $usuario->update(["apellidos" => $req->apellidos]);
                break;

            case "nom_usuario":
                $usuario->update(["nom_usuario" => $req->nom_usuario]);
                break;

            case "correo":
                $usuario->update(["correo" => $req->correo]);
                break;

            case "nit":
                $usuario->update(["nit" => $req->nit]);
                break;

            default:
                abort(500, "Opción de modificación no encontrada");
                break;
        }
    }

    public static function listUsersByLabForProject($table, $field, $id_corrida_area)
    {
        $usuarios = DB::table("usuario")
            ->join("usuario_laboratorio", "usuario.id_usuario", "=", "usuario_id_usuario")
            ->join($table, $table.".laboratorio_id_laboratorio", "=", "usuario_laboratorio.laboratorio_id_laboratorio")
            ->where($field, $id_corrida_area)
            ->get();

        return $usuarios;
    }

}
