<?php

namespace App\Http\Controllers;

use App\Models\Busqueda;
use App\Models\Configuracion;
use App\Models\Indicadores;
use App\Models\Resultado;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Mail;
use App\Mail\NotificacionPaso3;

class IndicadoresController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Display all the static pages when authenticated
     *
     *
     * @return \Illuminate\View\View
     */

    public function busqueda()
    {
        $busqueda = Busqueda::where('estado', '=', '1')->first();
        $array = explode(",", $busqueda->todos);
        return $array;
    }

    public function configurar($indicador)
    {
        $array = $this->busqueda();
        $data = indicadores::where('idTablero', '=', $indicador)
            //->join('users', 'users.id', '=', 'indicadores.responsable')
            ->where('estado', '=', '0')
            //->where('idusuario', '=', '0')
            //->orderBy('id_compromiso', 'desc')
            ->whereIn('indicadores.idIndicador', $array)
            ->get();

        $indicador = DB::table('tablero')
            ->where('idTablero', '=', $indicador)
            ->first();

        return View('configurar.configIndicadores', [
            'data' => $data,
            'indicador' => $indicador->nombreTablero,
            'objetivo' => $indicador->objetivo,

        ]);
    }

    public function configTablero()
    {

        return View('configurar.configTablero', []);
    }
    public function configPaso1()
    {

        DB::table('resultado')->update(['estado' => 0]);
        DB::table('configuracion')->where('idconf', 3)->update(['estado' => 0]);
        return response()->json(['success' => true, 'message' => 'Paso 1 completado']);
    }

    public function configPaso2()
    {
        DB::table('indicadores')->update(['estado' => 0]);
        DB::table('configuracion')->where('idconf', 2)->update(['estado' => 0]);
        return response()->json(['success' => true, 'message' => 'Paso 2 completado']);
    }

    public function configPaso3()
    {
        $mesActual = date('n'); // 1 a 12
        $anio = date('Y');

        // Calcular el mes de origen
        if ($mesActual == 1) {
            // Enero → origen: noviembre del año anterior
            $mesOrigen = 11;
            $anioOrigen = $anio - 1;
            $idMesNuevo = 12; // diciembre
            $anioNuevo = $anio - 1;
        } elseif ($mesActual == 2) {
            // Febrero → origen: diciembre del año anterior
            $mesOrigen = 12;
            $anioOrigen = $anio - 1;
            $idMesNuevo = 1; // enero
            $anioNuevo = $anio;
        } else {
            // Otros meses → origen: mes - 2
            $mesOrigen = $mesActual - 2;
            $anioOrigen = $anio;
            $idMesNuevo = $mesActual - 1;
            $anioNuevo = $anio;
        }

        // Consulta los indicadores del mes origen
        $indicadores = DB::table('resultado')
            ->where('idMes', '=', $mesOrigen)
            ->where('año', '=', $anioOrigen)
            ->get();

        // Crear nuevos registros para el mes actual - 1
        foreach ($indicadores as $valor) {
            $registro = new Resultado();
            $registro->idIndicador = $valor->idIndicador;
            $registro->idMes = $idMesNuevo;
            $registro->meta = $valor->meta;
            $registro->valor = null;
            $registro->año = $anioNuevo;
            $registro->estado = 1;
            $registro->save();
        }

        DB::table('indicadores')->update(['estado' => 1]);
        DB::table('configuracion')->where('idconf', 2)->update(['estado' => 1]);
        DB::table('configuracion')->where('idconf', 3)->update(['estado' => 1]);

        // Enviar correos a todos los usuarios
        /*$usuarios = DB::table('users')->whereNotNull('email')->pluck('email')->take(5);
        foreach ($usuarios as $email) {
            Mail::to($email)->queue(new NotificacionPaso3('Se ha ejecutado el Paso 3 correctamente para el periodo actual.'));
            //Mail::to('destinao@correo.com')->send(new NotificacionPaso3('Este es un mensaje de prueba.'));
        }*/


        return response()->json(['success' => true, 'message' => 'Paso 3 completado']);
    }

    public function obtenerEstadoPasos()
    {
        $estadoPaso1 = DB::table('configuracion')->where('idconf', 3)->value('estado');
        $estadoPaso2 = DB::table('configuracion')->where('idconf', 2)->value('estado');

        return response()->json([
            'paso1' => $estadoPaso1, // 1 = activo, 0 = ya ejecutado
            'paso2' => $estadoPaso2,
            'sp' => 1
        ]);
    }

    public function cargarSP()
    {

        /*$pdo = DB::connection('sqlsrv')->getPdo();
        $statement = $pdo->prepare("EXEC sp_carga_valores_indicadores");
        $result = $statement->execute();*/

        return response()->json(['success' => true, 'message' => 'SP completado']);
    }

    public function ejecutarAutomatico()
    {
        // Ejecuta todos los pasos de forma automática
        $this->setear();
        $this->inicializar();
        return $this->cargar();
    }

    public function confEditable($tipo)
    {

        $array = $this->busqueda();

        $mes = date("n");
        $anio = date("Y");

        $data = indicadores::where('idTablero', '=', $tipo)
            ->join('resultado', 'resultado.idIndicador', '=', 'indicadores.idIndicador')
            ->where('resultado.estado', '=', '1')
            ->where('idMes', '=', $mes)
            ->whereNull('valor')
            ->where('año', '=', $anio)
            //->orderBy('id_compromiso', 'desc')
            ->whereIn('indicadores.idIndicador', $array)
            ->get();

        $indicador = DB::table('tablero')
            ->where('idTablero', '=', $tipo)
            ->first();

        return View('configurar.editIndicadores', [
            'data' => $data,
            'indicador' => $indicador->nombreTablero,
            'tipo' => $tipo,
            'objetivo' => $indicador->objetivo,

        ]);
    }

    public function tableros($tipo)
    {

        $busque = DB::table('busqueda')
            ->where('estado', '=', 1)
            ->first();

        $this->middleware('guest')->except('logout');

        $array = $this->busqueda();

        $mesActual = date('n');
        $anio = date('Y');
        if ($mesActual == 1) {
            // Si es enero, tomar diciembre del año anterior
            $mesOrigen = 12;
            $anioOrigen = $anio - 1;
        } else {
            // Cualquier otro mes toma el mes anterior del mismo año
            $mesOrigen = $mesActual - 1;
            $anioOrigen = $anio;
        }

        $data = indicadores::where('idTablero', '=', $tipo)
            ->join('resultado', 'resultado.idIndicador', '=', 'indicadores.idIndicador')
            ->where('resultado.estado', '=', '1')
            ->whereNotNull('valor')
            ->where('idMes', '=', $mesOrigen)
            ->where('año', '=', $anioOrigen)
            //->orderBy('id_compromiso', 'desc')
            ->whereIn('indicadores.idIndicador', $array)
            ->get();

        $indicador = DB::table('tablero')
            ->where('idTablero', '=', $tipo)
            ->first();

        return View('configurar.tableroIndicadores', [
            'data' => $data,
            'indicador' => $indicador->nombreTablero,
            'tipo' => $tipo,
            'objetivo' => $indicador->objetivo,
            'activar' => $busque->idbusqueda,

        ]);
    }

    public function indicadores($tipo)
    {
        $array = $this->busqueda();

        $mesActual = date('n');
        $anio = date('Y');
        if ($mesActual == 1) {
            // Si es enero, tomar diciembre del año anterior
            $mesOrigen = 12;
            $anioOrigen = $anio - 1;
        } else {
            // Cualquier otro mes toma el mes anterior del mismo año
            $mesOrigen = $mesActual - 1;
            $anioOrigen = $anio;
        }

        $data = indicadores::where('idTablero', '=', $tipo)
            ->join('resultado', 'resultado.idIndicador', '=', 'indicadores.idIndicador')
            ->where('resultado.estado', '=', '1')
            ->where('idMes', '=', $mesOrigen)
            ->whereNull('valor')
            ->where('año', '=', $anioOrigen)
            //->orderBy('id_compromiso', 'desc')
            ->whereIn('indicadores.idIndicador', $array)
            ->get();

        $indicador = DB::table('tablero')
            ->where('idTablero', '=', $tipo)
            ->first();

        $fechaIndicador = DB::table('configuracion')
            ->where('idconf', '=', 1)
            ->first();

        return View('configurar.listarIndicadores', [
            'data' => $data,
            'indicador' => $indicador->nombreTablero,
            'tipo' => $tipo,
            'objetivo' => $indicador->objetivo,
            'fechaIndicador' => $fechaIndicador,

        ]);
    }

    public function crearValor($id, $resultado, $tipo)
    {
        $data = indicadores::where('resultado.idresultado', '=', $resultado)
            ->join('resultado', 'resultado.idIndicador', '=', 'indicadores.idIndicador')
            ->first();

        return view('resultado.add', [
            'id' => $id,
            'tipo' => $tipo,
            'objetivo' => $data->objetivo,
            'indicador' => $data->indicador,
            'meta' => $data->meta,
            'tipoH' => $data->tipo,
            'idresultado' => $data->idresultado,
        ]);
    }

    public function saveValor(Request $request)
    {

        if ($request->valor == '') {
            $color = '-';
        } else if ($request->tipoH == 'h' && $request->valor >= ($request->meta)) {
            $color = 'V';
        } else if ($request->tipoH == 'h' && $request->valor >= ($request->meta * 0.9)) {
            $color = 'A';
        } else if ($request->tipoH == 'h' && $request->valor < ($request->meta * 0.9)) {
            $color = 'R';
        } else if ($request->tipoH == 'i' && $request->valor <= ($request->meta)) {
            $color = 'V';
        } else if ($request->tipoH == 'i' && $request->valor <= ($request->meta * 1.1)) {
            $color = 'A';
        } else if ($request->tipoH == 'i' && $request->valor > ($request->meta * 1.1)) {
            $color = 'R';
        } else if ($request->tipoH == 'n' && $request->valor == ($request->meta)) {
            $color = 'V';
        } else if ($request->tipoH == 'n' && $request->valor != ($request->meta)) {
            $color = 'R';
        }

        $data = resultado::find($request->idresultado);
        $data->valor = $request->valor;
        $data->colores = $color;
        $data->save();

        flash()->addSuccess(
            'Registro Ingresado correctamente!',
            ''
        );
        return Redirect::to('indicadores/' . $request->tipo);
    }

    public function historialMeses($id, $tipo)
    {
        $array = $this->busqueda();

        $mes = date("n") - 1;
        $anio = date("Y");

        /*$mes = 11;
        $anio = '2024';*/

        $data = indicadores::where('idTablero', '=', $tipo)
            ->join('resultado', 'resultado.idIndicador', '=', 'indicadores.idIndicador')
            ->where('año', '=', $anio)
            ->where('indicadores.idIndicador', '=', $id)
            //->orderBy('id_compromiso', 'desc')
            ->whereIn('indicadores.idIndicador', $array)
            ->get();

        $tablero = DB::table('tablero')
            ->where('idTablero', '=', $tipo)
            ->first();

        return View('paginas.historialMeses', [
            'data' => $data,
            'indicador' => $tablero->nombreTablero,
            'tipo' => $tipo,

        ]);
    }

    public function promedio($tipo)
    {

        $array = $this->busqueda();
        $data = indicadores::where('idTablero', '=', $tipo)
            ->join('promedio', 'promedio.idIndicador', '=', 'indicadores.idIndicador')
            ->whereIn('indicadores.idIndicador', $array)
            ->get();

        $indicador = DB::table('tablero')
            ->where('idTablero', '=', $tipo)
            ->first();

        return View('paginas.promedio', [
            'data' => $data,
            'indicador' => $indicador->nombreTablero,
            'tipo' => $tipo,
        ]);
    }

    public function correctivas(Request $request, $tipo, $color = null)
    {
        $array = $this->busqueda();

        // Obtener año y mes desde el request (si no vienen, se usan valores por defecto)
        $anio = $request->get('anio', date('Y'));
        $mes = $request->get('mes', date('n') - 1); // enero=0, febrero=1, ...

        if ($color == null) {
            $data = [];
        } else {
            $data = indicadores::where('idTablero', '=', $tipo)
                ->join('resultado', 'resultado.idIndicador', '=', 'indicadores.idIndicador')
                ->join('users', 'users.id', '=', 'indicadores.responsable')
                //->where('resultado.estado', '=', '1')
                ->where('idMes', '=', $mes)
                ->where('año', '=', $anio)
                ->where('colores', '=', $color)
                ->whereIn('indicadores.idIndicador', $array)
                ->get();
        }

        $indicador = DB::table('tablero')
            ->where('idTablero', '=', $tipo)
            ->first();

        $meses = DB::table('meses')->get(); // Asegúrate que la tabla se llame así

        return view('configurar.accionesCorrectivas', [
            'data' => $data,
            'indicador' => $indicador->nombreTablero,
            'tipo' => $tipo,
            'objetivo' => $indicador->objetivo,
            'meses' => $meses,
            'filtroAño' => $anio,
            'filtroMes' => $mes,
        ]);
    }
    public function addDocumentoAcc(Request $request)
    {
        $file = $request->file('subir_archivo');
        $nombre = time() . "_" . $file->getClientOriginalName();
        //$file->store('public');
        \Storage::disk('acciones')->put($nombre, \File::get($file));

        $registro = Resultado::find($request->idresultado);
        $registro->nameArchivo = $nombre;
        $registro->archivo = 1;
        $registro->save();

        flash()->addSuccess(
            'Archivo subido correctamente!',
            ''
        );
        return Redirect::to('correctivas/' . $request->tipo . '/' . $request->color);
    }

    public function descargarAcc($resultado)
    {
        return \Storage::disk('acciones')->download($resultado);
    }

    public function configFecha()
    {
        $fecha = DB::table('configuracion')
            ->where('idconf', '=', 1)
            ->first();

        return View('configurar.configFecha', [
            'fecha' => $fecha,
        ]);
    }

    public function saveFecha(Request $request)
    {

        $fecha = Configuracion::find($request->id);
        $fecha->fecha = $request->fecha;
        $fecha->save();

        flash()->addSuccess(
            'Actulizado correctamente!',
            ''
        );
        return Redirect::to('cofigFecha');
    }

    public function configPromedios()
    {
        $anios = DB::table('resultado')
            ->select('*')
            ->distinct('año')
            ->pluck('año', 'año')
            ->all();

        return View('configurar.configPromedios', [
            'anio' => $anios,
        ]);
    }

    public function procesarPromedio(Request $request)
    {
        $anio = $request->id_anio;
        $arr1 = str_split($anio);

        for ($i = 1; $i <= 142; $i++) {

            $promedio = DB::select('select round(AVG(valor),2) as uno from resultado where idIndicador =' . $i . ' and año =' . $anio);
            DB::table('promedio')
                ->where('idIndicador', $i)
                ->update(['_' . $arr1[0] . $arr1[1] . '_' . $arr1[2] . $arr1[3] => $promedio[0]->uno]);
        }
        flash()->addSuccess(
            'Se proceso correctamente!',
            ''
        );
        return Redirect::to('configPromedios');
    }


    public function actualizarMetaValor(Request $request)
    {

        if ($request->valor == '') {
            $color = '-';
        } else if ($request->tipo == 'h' && $request->valor >= ($request->meta)) {
            $color = 'V';
        } else if ($request->tipo == 'h' && $request->valor >= ($request->meta * 0.9)) {
            $color = 'A';
        } else if ($request->tipo == 'h' && $request->valor < ($request->meta * 0.9)) {
            $color = 'R';
        } else if ($request->tipo == 'i' && $request->valor <= ($request->meta)) {
            $color = 'V';
        } else if ($request->tipo == 'i' && $request->valor <= ($request->meta * 1.1)) {
            $color = 'A';
        } else if ($request->tipo == 'i' && $request->valor > ($request->meta * 1.1)) {
            $color = 'R';
        } else if ($request->tipo == 'n' && $request->valor == ($request->meta)) {
            $color = 'V';
        } else if ($request->tipo == 'n' && $request->valor != ($request->meta)) {
            $color = 'R';
        }

        $resultado = Resultado::findOrFail($request->idResultado);
        $resultado->meta = $request->meta;
        $resultado->valor = $request->valor;
        $resultado->colores = $color;
        $resultado->save();

        return response()->json(['success' => true]);
    }
}
