<?php

namespace App\Http\Controllers;

// Controladores
use App\AnalitoEP15;
use App\Http\Controllers\Controller;
use App\Http\Controllers\LaboratorioController;
use App\Http\Controllers\UsuarioController;
use App\Http\Controllers\AreaController;
use Illuminate\Support\Facades\DB;

// Modelos
use App\ProyectoEP15;

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

// Requests
use Illuminate\Http\Request;
use App\Http\Requests\ProyectoEP15Request;

// Sesion
use Auth;
use Exception;

class ProyectoEP15Controller extends Controller
{

    protected $tableProyectoEP15;
    protected $historico;

    public function __construct()
    {
        $this->tableProyectoEP15 = new ProyectoEP15();
    }


    public function section(Request $req)
    {
        $proyectosEP15 = self::list($req->id_laboratorio, $req->id_area);
        $laboratorios = LaboratorioController::listAll();
        $areas = AreaController::list();
        $areasActuales = [];
        foreach ($proyectosEP15 as $proyectoEP15){
            $proyectoEP15['analitos'] = $this->getAnalitosEp15($proyectoEP15['id_proyecto_ep15']);
            if(!in_array($proyectoEP15['area_id_area'], $areasActuales)){
                $areasActuales[] = $proyectoEP15['area_id_area'];
            }
        }

        $analitosActuales = [];
        $analitosEP15 = AnalitoEP15::query()->get();
        foreach ($analitosEP15 as $analitoEP15){
            foreach($proyectosEP15 as $proyectoEP15){
                if($proyectoEP15['id_proyecto_ep15'] == $analitoEP15['proyecto_ep15_id_proyecto_ep15']){
                    if(!in_array($analitoEP15['analito_id_analito'], $analitosActuales)){
                        $analitosActuales[] = $analitoEP15['analito_id_analito'];
                    }
                }
            }
        }

        return view("proyectoEP15.proyectoEP15Section")
            ->with("nomSection", "SeeSectionProyectoEP15")
            ->with("laboratorios", $laboratorios)
            ->with("areas", $areas)
            ->with("proyectosEP15", $proyectosEP15)
            ->with("numeroAreasEP15", count($areasActuales))
            ->with("numeroAnalitosEP15", count($analitosActuales));
    }

    public function create()
    {
        $laboratorios = LaboratorioController::listAll();
        $areas = AreaController::list();
        return view("proyectoEP15.proyectoEP15Create")
            ->with("laboratorios", $laboratorios)
            ->with("areas", $areas);
    }


    public function index(Request $req)
    {

        $proyectosEP15 = self::list($req->id_laboratorio, $req->id_area);

        $areasActuales = [];
        foreach ($proyectosEP15 as $proyectoEP15){
            $proyectoEP15['analitos'] = $this->getAnalitosEp15($proyectoEP15['id_proyecto_ep15']);
            if(!in_array($proyectoEP15['area_id_area'], $areasActuales)){
                $areasActuales[] = $proyectoEP15['area_id_area'];
            }
        }

        $analitosActuales = [];
        $analitosEP15 = AnalitoEP15::query()->get();
        foreach ($analitosEP15 as $analitoEP15){
            foreach($proyectosEP15 as $proyectoEP15){
                if($proyectoEP15['id_proyecto_ep15'] == $analitoEP15['proyecto_ep15_id_proyecto_ep15']){
                    if(!in_array($analitoEP15['analito_id_analito'], $analitosActuales)){
                        $analitosActuales[] = $analitoEP15['analito_id_analito'];
                    }
                }
            }
        }

        return view("proyectoEP15.proyectoEP15Index")
            ->with("proyectosEP15", $proyectosEP15)
            ->with("numeroAreasEP15", count($areasActuales))
            ->with("numeroAnalitosEP15", count($analitosActuales));
    }


    public function store(ProyectoEP15Request $req)
    {
        $user = Auth::user();
        $client = DB::table("super_admin")
            ->where("id", $user->super_admin_id)
            ->first();
        $users = DB::table("proyecto_ep15")
            ->where("client", $user->super_admin_id)
            ->count();

        if ($users < $client->num_project) {
            $this->historico = new ProyectoEP15Historico();
            $this->historico->store("store", $req);
            $this->tableProyectoEP15->laboratorio_id_laboratorio = $req->id_laboratorio;
            $this->tableProyectoEP15->area_id_area = $req->id_area;
            $this->tableProyectoEP15->fecha_inicio = $req->fecha_inicio;
            $this->tableProyectoEP15->material_utilizado = $req->material_utilizado;
            $this->tableProyectoEP15->num_niveles = $req->num_niveles;
            $this->tableProyectoEP15->client = $user->super_admin_id;
            $this->tableProyectoEP15->usuario_id_usuario = $user->id_usuario;
            $this->tableProyectoEP15->save();
        } else {
            throw new Exception('División por cero.');
        }
    }

    public static function getAnalitosEp15($idProyectoEP15)
    {
        $analitos = DB::table("analito_ep15")
            ->select("analito.nom_analito")
            ->join("analito", "analito_ep15.analito_id_analito", "=", "analito.id_analito")
            ->where("proyecto_ep15_id_proyecto_ep15", $idProyectoEP15)
            ->get();
        $listaAnalitos = [];
        foreach ($analitos as $analito) {
            $listaAnalitos[] = $analito->nom_analito;
        }
        if (count($listaAnalitos) > 0) {
            return implode(", ", $listaAnalitos);
        } else {
            return "No hay analitos";
        }
    }

    public static function list($laboratorio = "", $area = "")
    {

        if (Auth::user()->rol_id_rol == 5) {
            $tableProyectoEP15 = new ProyectoEP15();
            $obj_bd = $tableProyectoEP15
                ->select(
                    "area.*",
                    "laboratorio.*",
                    "usuario.nombres",
                    "proyecto_ep15.id_proyecto_ep15",
                    "proyecto_ep15.area_id_area",
                    "proyecto_ep15.fecha_inicio",
                    "proyecto_ep15.estado as estado_proyecto_ep15",
                    "proyecto_ep15.material_utilizado",
                    "proyecto_ep15.num_niveles",
                    "super_admin.name as client_name"
                )
                ->join("area", "area.id_area", "=", "proyecto_ep15.area_id_area")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "proyecto_ep15.laboratorio_id_laboratorio")
                ->join("usuario", "usuario.id_usuario", "=", "proyecto_ep15.usuario_id_usuario")
                ->join("super_admin", "super_admin.id", "=", "proyecto_ep15.client")
                ->orderBy("proyecto_ep15.estado", "desc")
                ->orderBy("laboratorio.no_laboratorio", "asc")
                ->orderBy("area.nom_area", "asc");

            if ($laboratorio != "" && $area != "") { // Si tanto el area como el laboratorio estan definidos
                $obj_bd->where([
                    ["laboratorio.id_laboratorio", "=", $laboratorio],
                    ["area.id_area", "=", $area]
                ]);
            } else if ($laboratorio != "") { // Si solo el laboratorio esta definido
                $obj_bd->where("laboratorio.id_laboratorio", $laboratorio);
            } else if ($area != "") { // Si solo el area esta definida
                $obj_bd->where("area.id_area", $area);
            }
            return $obj_bd->get();
        } else {
            if (Auth::user()->rol_id_rol == 1) { // Administrador total
                $tableProyectoEP15 = new ProyectoEP15();
                $obj_bd = $tableProyectoEP15
                    ->select(
                        "area.*",
                        "laboratorio.*",
                        "usuario.*",
                        "proyecto_ep15.id_proyecto_ep15",
                        "proyecto_ep15.area_id_area",
                        "proyecto_ep15.fecha_inicio",
                        "proyecto_ep15.estado as estado_proyecto_ep15",
                        "proyecto_ep15.material_utilizado",
                        "proyecto_ep15.num_niveles"
                    )
                    ->join("area", "area.id_area", "=", "proyecto_ep15.area_id_area")
                    ->join("laboratorio", "laboratorio.id_laboratorio", "=", "proyecto_ep15.laboratorio_id_laboratorio")
                    ->join("usuario", "usuario.id_usuario", "=", "proyecto_ep15.usuario_id_usuario")
                    ->where("proyecto_ep15.client", Auth::user()->super_admin_id)
                    ->orderBy("proyecto_ep15.estado", "desc")
                    ->orderBy("laboratorio.no_laboratorio", "asc")
                    ->orderBy("area.nom_area", "asc");

                if ($laboratorio != "" && $area != "") { // Si tanto el area como el laboratorio estan definidos
                    $obj_bd->where([
                        ["laboratorio.id_laboratorio", "=", $laboratorio],
                        ["area.id_area", "=", $area]
                    ]);
                } else if ($laboratorio != "") { // Si solo el laboratorio esta definido
                    $obj_bd->where("laboratorio.id_laboratorio", $laboratorio);
                } else if ($area != "") { // Si solo el area esta definida
                    $obj_bd->where("area.id_area", $area);
                }
                return $obj_bd->get();
            } else { // Cualquier otro tipo de usuario
                $tableProyectoEP15 = new ProyectoEP15();
                $obj_bd = $tableProyectoEP15
                    ->select(
                        "area.*",
                        "laboratorio.*",
                        "usuario.*",
                        "proyecto_ep15.id_proyecto_ep15",
                        "proyecto_ep15.fecha_inicio",
                        "proyecto_ep15.area_id_area",
                        "proyecto_ep15.estado as estado_proyecto_ep15",
                        "proyecto_ep15.material_utilizado",
                        "proyecto_ep15.num_niveles",
                        "proyecto_ep15.material_utilizado",
                        "proyecto_ep15.num_niveles"
                    )
                    ->join("area", "area.id_area", "=", "proyecto_ep15.area_id_area")
                    ->join("laboratorio", "laboratorio.id_laboratorio", "=", "proyecto_ep15.laboratorio_id_laboratorio")
                    ->join("usuario_laboratorio", "laboratorio.id_laboratorio", "=", "usuario_laboratorio.laboratorio_id_laboratorio")
                    ->join("usuario", "usuario.id_usuario", "=", "proyecto_ep15.usuario_id_usuario")
                    ->where("proyecto_ep15.client", Auth::user()->super_admin_id)
                    ->orderBy("proyecto_ep15.estado", "desc")
                    ->orderBy("laboratorio.no_laboratorio", "asc")
                    ->orderBy("area.nom_area", "asc");

                if ($laboratorio != "" && $area != "") { // Si tanto el area como el laboratorio estan definidos
                    $obj_bd->where([
                        ["laboratorio.id_laboratorio", "=", $laboratorio],
                        ["area.id_area", "=", $area],
                        ["usuario_laboratorio.usuario_id_usuario", "=", Auth::user()->id_usuario]
                    ]);
                } else if ($laboratorio != "") { // Si solo el laboratorio esta definido
                    $obj_bd->where([
                        ["laboratorio.id_laboratorio", $laboratorio],
                        ["usuario_laboratorio.usuario_id_usuario", "=", Auth::user()->id_usuario]
                    ]);
                } else if ($area != "") { // Si solo el area esta definida
                    $obj_bd->where([
                        ["area.id_area", $area],
                        ["usuario_laboratorio.usuario_id_usuario", "=", Auth::user()->id_usuario]
                    ]);
                } else {
                    $obj_bd->where([
                        ["usuario_laboratorio.usuario_id_usuario", "=", Auth::user()->id_usuario]
                    ]);
                }

                return $obj_bd->get();
            }
        }


    }

    public static function listItem($id_proyecto_ep15)
    {
        $tableProyectoEP15 = new ProyectoEP15();
        return $tableProyectoEP15
            ->select(
                "laboratorio.*",
                "area.*",
                "proyecto_ep15.id_proyecto_ep15",
                "proyecto_ep15.laboratorio_id_laboratorio",
                "proyecto_ep15.area_id_area",
                "proyecto_ep15.fecha_inicio",
                "proyecto_ep15.estado as estado_proyecto_ep15",
                "proyecto_ep15.material_utilizado",
                "proyecto_ep15.num_niveles"
            )
            ->join("laboratorio", "laboratorio.id_laboratorio", "=", "proyecto_ep15.laboratorio_id_laboratorio")
            ->join("area", "area.id_area", "=", "proyecto_ep15.area_id_area")
            ->where("id_proyecto_ep15", "=", $id_proyecto_ep15)
            ->first();
    }


    public static function listAll()
    {

        $tableProyectoEP15 = new ProyectoEP15();

        if (Auth::user()->rol_id_rol == 1) { // para administrador total
            return $tableProyectoEP15
                ->select(
                    "area.*",
                    "laboratorio.*",
                    "proyecto_ep15.id_proyecto_ep15",
                    "proyecto_ep15.fecha_inicio",
                    "proyecto_ep15.estado as estado_proyecto_ep15",
                    "proyecto_ep15.material_utilizado",
                    "proyecto_ep15.num_niveles"
                )
                ->join("area", "area.id_area", "=", "proyecto_ep15.area_id_area")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "proyecto_ep15.laboratorio_id_laboratorio")
                ->orderBy("proyecto_ep15.id_proyecto_ep15", "asc")
                ->get();
        } else { // Si es otro usuario
            // Solo pueda ver los que tiene asignados
            $id_usuario = Auth::user()->id_usuario;
            return $tableProyectoEP15
                ->select(
                    "area.*",
                    "laboratorio.*",
                    "proyecto_ep15.id_proyecto_ep15",
                    "proyecto_ep15.fecha_inicio",
                    "proyecto_ep15.estado as estado_proyecto_ep15",
                    "proyecto_ep15.material_utilizado",
                    "proyecto_ep15.num_niveles"
                )
                ->join("area", "area.id_area", "=", "proyecto_ep15.area_id_area")
                ->join("laboratorio", "laboratorio.id_laboratorio", "=", "proyecto_ep15.laboratorio_id_laboratorio")
                ->orderBy("proyecto_ep15.id_proyecto_ep15", "asc")
                ->where(function ($query) use ($id_usuario) {
                    $id_labs = UsuarioController::listLaboratorios($id_usuario, "array", "id_laboratorio");
                    return $query->whereIn("laboratorio.id_laboratorio", $id_labs);
                })
                ->get();
        }

    }


    public function verUsuarios(Request $req){
        $proyectoEP15 = self::ListItem($req->id_reference);
        $users = UsuarioController::listUsersByLabForProject("proyecto_ep15","id_proyecto_ep15",$proyectoEP15->id_proyecto_ep15);
        return view("proyectoEP15.proyectoEP15Access")
            ->with("proyectoEP15", $proyectoEP15)
            ->with("users",$users);
    }


    public function edit(Request $req)
    {

        $proyectoEP15 = self::ListItem($req->id_reference);
        $laboratorios = LaboratorioController::listAll();
        $areas = AreaController::list();

        return view("proyectoEP15.proyectoEP15Edit")
            ->with("laboratorios", $laboratorios)
            ->with("areas", $areas)
            ->with("proyectoEP15", $proyectoEP15);
    }


    public function listHTML()
    {

        $proyectosEP15 = Self::listAll();

        return view("proyectoEP15.proyectoEP15List")
            ->with("proyectosEP15", $proyectosEP15);
    }


    public static function getAreaById($id_proyecto_ep15)
    {

        $tableProyectoEP15 = new ProyectoEP15();
        return $tableProyectoEP15
            ->where("id_proyecto_ep15", $id_proyecto_ep15)
            ->first()["area_id_area"];
    }


    public function destroy(Request $req)
    {

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

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


    public function status(Request $req)
    {

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

        $statusNow = $this->tableProyectoEP15
            ->where("id_proyecto_ep15", $req->id)
            ->first()
            ->estado;

        $registroUpdate = $this->tableProyectoEP15
            ->where("id_proyecto_ep15", $req->id);

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


    public function show(Request $req)
    {
        $area = $this->tableArea
            ->where("id_area", $req->id)
            ->first();

        return view("area.areaShow")
            ->with("area", $area)
            ->with("campo", $req->campo);
    }


    public function update(ProyectoEP15Request $req)
    {

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

        $proyectoEP15 = $this->tableProyectoEP15
            ->where("id_proyecto_ep15", $req->id)
            ->first();

        $proyectoEP15->update([
            "laboratorio_id_laboratorio" => $req->id_laboratorio,
            "area_id_area" => $req->id_area,
            "fecha_inicio" => $req->fecha_inicio,
            "material_utilizado" => $req->material_utilizado,
            "num_niveles" => $req->num_niveles
        ]);
    }
}
