<?php

namespace App\Http\Controllers;

// Controladores

use App\AnalitoEP15;
use App\CorridaAnalito;
use App\CorridaArea;
use App\Http\Controllers\Controller;
use App\Http\Controllers\RolController;
use App\Http\Controllers\LaboratorioController;
use App\Http\Historico\SuperUsuarioHistorico;
// Historicos
use App\Http\Historico\UsuarioHistorico;
use App\Http\Requests\SuperUsuarioRequest;
// Modelos
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\SuperUsuario;
use App\Usuario;

// Requests
use Illuminate\Http\Request;
use App\Http\Requests\UsuarioRequest;
use App\Http\Requests\UsuarioAsignationLabRequest;
use App\ProyectoEP15;
use Illuminate\Support\Facades\Storage;

class SuperUsuarioController extends Controller
{

    protected $tableUsua;
    protected $historico;

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

    public function section()
    {

        /* $clientReference = SuperUsuario::query()->where('id', $usuarioAutenticado->super_admin_id)->first(); */
        /* $proyectosEP15 = ProyectoEP15::query()->where('client', $clientReference->id)->get(); */
        /* $contadorTotalProyectos = 0; */
        /* foreach ($proyectosEP15 as $proyectoEP15){ */
        /*     $analitosEP15 = AnalitoEP15::query() */
        /*         ->where('proyecto_ep15_id_proyecto_ep15', $proyectoEP15->id_proyecto_ep15)->get(); */
        /*     $contadorTotalProyectos += count($analitosEP15); */
        /* } */

        /* $proyectosEP09 = CorridaArea::query()->where('client', $clientReference->id)->get(); */
        /* foreach ($proyectosEP09 as $proyectoEPO9){ */
        /*     $analitosEP09 = CorridaAnalito::query() */
        /*         ->where('corrida_area_id_corrida_area', $proyectoEPO9->id_corrida_area)->get(); */
        /*     $contadorTotalProyectos += count($analitosEP09); */
        /* } */


        $usuarios = $this->tableUsua
            ->select(
                "id",
                "name",
                "num_user",
                "num_project",
                "imagen_cliente",
                "active",
                DB::raw("count(DISTINCT usuario.id_usuario) as num_users"),
                DB::raw("count(DISTINCT analito_ep15.analito_id_analito) as num_analitos_ep15"),
                DB::raw("count(DISTINCT corrida_analito.analito_id_analito) as num_corridas")
            )
            ->leftJoin("usuario", "usuario.super_admin_id", "=", "id")
            ->leftJoin("proyecto_ep15", "proyecto_ep15.client", "=", "id")
            ->leftJoin("analito_ep15", "analito_ep15.proyecto_ep15_id_proyecto_ep15", "=", "proyecto_ep15.id_proyecto_ep15")
            ->leftJoin("corrida_area", "corrida_area.client", "=", "id")
            ->leftJoin("corrida_analito", "corrida_analito.corrida_area_id_corrida_area", "=", "corrida_area.id_corrida_area")
            ->groupBy(
                "super_admin.id",
                "super_admin.name",
                "super_admin.num_user",
                "super_admin.num_project",
                "super_admin.imagen_cliente",
                "corrida_area.client",
                "proyecto_ep15.client"
            )
            ->orderBy("name", "asc")
            ->get();

        $rol = RolController::listItem(1);


        return view("superUser.usuarioSection")
            ->with("usuarios", $usuarios)
            ->with("rol", $rol)
            ->with("nomSection", "SeeSectionSuperUsuario")
            ->with("laboratoriosAsignados", []);
    }


    public function index()
    {
        $usuarios = $this->tableUsua
            ->select(
                "id",
                "name",
                "num_user",
                "num_project",
                "imagen_cliente",
                "active",
                DB::raw("count(DISTINCT usuario.id_usuario) as num_users"),
                DB::raw("count(DISTINCT analito_ep15.analito_id_analito) as num_analitos_ep15"),
                DB::raw("count(DISTINCT corrida_analito.analito_id_analito) as num_corridas")
            )
            ->leftJoin("usuario", "usuario.super_admin_id", "=", "id")
            ->leftJoin("proyecto_ep15", "proyecto_ep15.client", "=", "id")
            ->leftJoin("analito_ep15", "analito_ep15.proyecto_ep15_id_proyecto_ep15", "=", "proyecto_ep15.id_proyecto_ep15")
            ->leftJoin("corrida_area", "corrida_area.client", "=", "id")
            ->leftJoin("corrida_analito", "corrida_analito.corrida_area_id_corrida_area", "=", "corrida_area.id_corrida_area")
            ->groupBy(
                "super_admin.id",
                "super_admin.name",
                "super_admin.num_user",
                "super_admin.num_project",
                "super_admin.imagen_cliente",
                "corrida_area.client",
                "proyecto_ep15.client"
            )
            ->orderBy("name", "asc")
            ->get();

        return view("superUser.usuarioIndex")
            ->with("usuarios", $usuarios);
    }


    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(
                "id",
                "name",
                "num_user",
                "num_project",
                "imagen_cliente"
            )
            ->orderBy("name", "asc")
            ->where("id", $req->id)
            ->first();

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


    public function indexAsignationLaboratorio(Request $req)
    {
        $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();

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


    private function get_image_filename($base_64_file){
        $extension = explode('/', explode(';', $base_64_file)[0])[1];
        return uniqid().'.'.$extension;
    }

    public function store(SuperUsuarioRequest $req)
    {
        if (!isset($req->imagen_cliente)) {
            $path_imagen = "/img/v2m.jpg";
        } else {
            $filename = $this->get_image_filename($req->imagen_cliente);
            $imagen = base64_decode(explode(',', $req->imagen_cliente)[1]);
            Storage::disk('local')->put('public/'.$filename, $imagen, 'public');
            $path_imagen = Storage::url($filename);
            $this->historico = new SuperUsuarioHistorico();
            $this->historico->store("store", $req);
        }


        $id = DB::table("super_admin")->insertGetId(
            array(
                "name" => $req->name,
                "num_user" => $req->num_user,
                "num_project" => $req->num_project,
                "tipo_de_suscripcion" => $req->tipo_de_suscripcion,
                "imagen_cliente" => $path_imagen
            )
        );

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

        DB::table("usuario")->insert(
            array(
                "rol_id_rol" => $req->id_rol,
                "nom_usuario" => $req->nom_usuario,
                "nombres" => $req->nombres,
                "apellidos" => $req->apellidos,
                "nit" => $req->nit,
                "correo" => $req->correo,
                "password" => Hash::make($req->password),
                "super_admin_id" => $id
            )
        );
    }

    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 SuperUsuario();
        return $tableUsua
            ->orderBy("name", "asc")
            ->get();
    }


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

        $tableUsua = new Usuario();
        $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()
    {

        $usuarios = $this->tableUsua
            ->orderBy("name", "asc")
            ->get();

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


    public function destroy(Request $req)
    {

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

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

    public function updateState(Request $req)
    {

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

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

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


    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 SuperUsuario();
        return $tableUsua
            ->where("id", $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", $req->id)
            ->first();

        switch ($req->campo) {

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

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

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

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

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


    public function update(SuperUsuarioRequest $req)
    {

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

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

        switch ($req->campo) {
            case "imagen_cliente":
                if (!isset($req->imagen_cliente)) {
                    $path_imagen = "/img/v2m.jpg";
                } else {
                    $filename = $this->get_image_filename($req->imagen_cliente);
                    $imagen = base64_decode(explode(',', $req->imagen_cliente)[1]);
                    Storage::disk('local')->put('public/'.$filename, $imagen, 'public');
                    $path_imagen = Storage::url($filename);
                    $this->historico = new SuperUsuarioHistorico();
                    $this->historico->store("store", $req);
                }
                $usuario->update(["imagen_cliente" => $path_imagen]);
                $usuario->save();
                break;
            case "name":
                $usuario->update(["name" => $req->name]);
                break;

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

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

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