<?php

namespace App\Http\Controllers;

// Controladores
use App\Http\Controllers\Controller;
use App\Http\Controllers\ProyectoEP15Controller;
use App\Http\Controllers\AnalitoController;
use App\Http\Controllers\MetodologiaController;
use App\Http\Controllers\ModoController;
use App\Http\Controllers\UnidadController;

// Modelos
use App\AnalitoEP15;
use Illuminate\Support\Facades\DB;

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

// Requests
use Illuminate\Http\Request;
use App\Http\Requests\AnalitoEP15Request;
use App\NivelEP15;

class AnalitoEP15Controller extends Controller
{
    protected $tableAnalitoEP15;
    protected $historico;

    public function __construct()
    {
        $this->tableAnalitoEP15 = new AnalitoEP15();
    }


    public function section(Request $req)
    {
        $proyectosEP15 = ProyectoEP15Controller::listAll();
        $modos = ModoController::list();
        $analitosEP15 = self::listByCorrida(0);
        return view("analitoEP15.analitoEP15Section")
            ->with("nomSection", "SeeSectionAnalitoEP15")
            ->with("proyectosEP15", $proyectosEP15)
            ->with("analitosEP15", $analitosEP15)
            ->with("modos", $modos)
            ->with("id_reference", $req->id_reference);
    }


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


    public function index(Request $req)
    {
        $analitosEP15 = self::listByCorrida($req->id_reference);
        return view("analitoEP15.analitoEP15Index")
            ->with("analitosEP15", $analitosEP15);
    }


    public function store(AnalitoEP15Request $req)
    {
        $this->historico = new AnalitoEP15Historico();
        $this->tableAnalitoEP15->proyecto_ep15_id_proyecto_ep15 = $req->id_proyecto_ep15;
        $this->tableAnalitoEP15->analito_id_analito = $req->id_analito;
        $this->tableAnalitoEP15->analizador_id_analizador = $req->id_analizador;
        $this->tableAnalitoEP15->unidad_id_unidad = $req->id_unidad;
        $this->tableAnalitoEP15->lote_reactivo = $req->lote_reactivo;
        $this->tableAnalitoEP15->lote_calibrador = $req->lote_calibrador;
        $this->tableAnalitoEP15->etmp = $req->etmp;
        $this->historico->store("store", $req);
        $this->tableAnalitoEP15->save();
        /*return Response(['errors' => ['El proyecto ya tiene registrado un analito']], $status = 422);*/
        /*proyecto_ep15_id_proyecto_ep15*/

    }

    public static function listByCorrida($id_proyecto_ep15)
    {
        $tableAnalitoEP15 = new AnalitoEP15();
        return $tableAnalitoEP15
            ->select(
                "proyecto_ep15.*",
                "analito_ep15.*",
                "analizador.*",
                "analito.*",
                "unidad.*",
                "analito_ep15.estado as estado_analito_ep15"
            )
            ->join("proyecto_ep15", "analito_ep15.proyecto_ep15_id_proyecto_ep15", "=", "proyecto_ep15.id_proyecto_ep15")
            ->join("analizador", "analizador.id_analizador", "=", "analito_ep15.analizador_id_analizador")
            ->join("analito", "analito.id_analito", "=", "analito_ep15.analito_id_analito")
            ->join("unidad", "unidad.id_unidad", "=", "analito_ep15.unidad_id_unidad")
            ->where([
                ["proyecto_ep15.id_proyecto_ep15", $id_proyecto_ep15],
            ])
            ->get();
    }


    public static function listItem($id_referencia)
    {
        $tableAnalitoEP15 = new AnalitoEP15();
        return $tableAnalitoEP15
            ->select(
                "proyecto_ep15.*",
                "analito_ep15.*",
                "analizador.*",
                "analito.*",
                "unidad.*",
                "analito_ep15.estado as estado_analito_ep15"
            )
            ->join("proyecto_ep15", "analito_ep15.proyecto_ep15_id_proyecto_ep15", "=", "proyecto_ep15.id_proyecto_ep15")
            ->join("analizador", "analizador.id_analizador", "=", "analito_ep15.analizador_id_analizador")
            ->join("analito", "analito.id_analito", "=", "analito_ep15.analito_id_analito")
            ->join("unidad", "unidad.id_unidad", "=", "analito_ep15.unidad_id_unidad")
            ->where("analito_ep15.id_analito_ep15", $id_referencia)
            ->first();
    }

    public static function analitoLevel($id_referencia, $nivel)
    {
        $tableNivel = new NivelEP15();
        return $tableNivel
            ->select(
                "nivel.*"
            )
            ->where([["nivel.analito_ep15_id_analito_ep15", $id_referencia], ["nivel.nivel", $nivel]])
            ->first();
    }


    public function edit(Request $req)
    {
        $analitoEP15 = $this->tableAnalitoEP15
            ->where("id_analito_ep15", $req->id)
            ->first();

        switch ($req->campo) {
            case "analito":
                $analitos = AnalitoController::listByProyectoEP15($analitoEP15->proyecto_ep15_id_proyecto_ep15);
                return view("analitoEP15.analitoEP15Edit")
                    ->with("analitoEP15", $analitoEP15)
                    ->with("campo", $req->campo)
                    ->with("analitos", $analitos);
                break;

            case "analizador":
                $analizadores = AnalizadorController::listByProyectoEP15($analitoEP15->proyecto_ep15_id_proyecto_ep15);
                return view("analitoEP15.analitoEP15Edit")
                    ->with("analitoEP15", $analitoEP15)
                    ->with("campo", $req->campo)
                    ->with("analizadores", $analizadores);
                break;

            case "unidad":
                $unidades = UnidadController::listByProyectoEP15($analitoEP15->proyecto_ep15_id_proyecto_ep15);
                return view("analitoEP15.analitoEP15Edit")
                    ->with("analitoEP15", $analitoEP15)
                    ->with("campo", $req->campo)
                    ->with("unidades", $unidades);
                break;

            case "etmp":
                return view("analitoEP15.analitoEP15Edit")
                    ->with("analitoEP15", $analitoEP15)
                    ->with("campo", $req->campo);
                break;

            case "lote_reactivo":
                return view("analitoEP15.analitoEP15Edit")
                    ->with("analitoEP15", $analitoEP15)
                    ->with("campo", $req->campo);
                break;

            case "lote_calibrador":
                return view("analitoEP15.analitoEP15Edit")
                    ->with("analitoEP15", $analitoEP15)
                    ->with("campo", $req->campo);
                break;

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


    public function destroy(Request $req)
    {

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

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


    public function status(Request $req)
    {

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

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

        $registroUpdate = $this->tableAnalitoEP15
            ->where("id_analito_ep15", $req->id);

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

    public function show(Request $req)
    {
        $analitoEP15 = self::listItem($req->id);

        return view("analitoEP15.analitoEP15Show")
            ->with("analitoEP15", $analitoEP15)
            ->with("campo", $req->campo);
    }


    public function update(AnalitoEP15Request $req)
    {

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

        $analitoEP15 = $this->tableAnalitoEP15
            ->where("id_analito_ep15", $req->id)
            ->first();

        switch ($req->campo) {
            case "id_analito":
                $analitoEP15->update(["analito_id_analito" => $req->id_analito]);
                break;
            case "id_analizador":
                $analitoEP15->update(["analizador_id_analizador" => $req->id_analizador]);
                break;
            case "etmp":
                $analitoEP15->update(["etmp" => $req->etmp]);
                break;
            case "id_unidad":
                $analitoEP15->update(["unidad_id_unidad" => $req->id_unidad]);
                break;
            case "lote_reactivo":
                $analitoEP15->update(["lote_reactivo" => $req->lote_reactivo]);
                break;
            case "lote_calibrador":
                $analitoEP15->update(["lote_calibrador" => $req->lote_calibrador]);
                break;
            default:
                abort(500, "Opción de modificación no encontrada");
                break;
        }
    }
}
