<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Services\PeriodoService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class TareasController extends Controller
{

    protected $nombrePeriodoActivo;


    public function __construct(PeriodoService $periodoService)
    {
        try {
            $this->nombrePeriodoActivo = $periodoService->obtenerPeriodoActivoNombre();
        } catch (\Exception $e) {
            $this->nombrePeriodoActivo = null;
        }
    }

    public function getAllTareas()
    {
        try {
            $tareas = DB::table('tareas as t')
                ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria')
                ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos')
                ->select(
                    'm.nombreMateria as materia',
                    'tt.nombreTareasTipos as tipo_tarea',
                    't.*'
                )
                ->distinct()
                ->orderBy('t.fechaPublicacion', 'desc')
                ->get();

            return response()->json($tareas);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al obtener las tareas: ' . $e->getMessage()
            ], 500);
        }
    }

    public function getTareasPorFechaEntrega($fecha, $idUsuario)
    {
        try {
            $tareas = DB::table('tareas as t')
                ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria')
                ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos')
                ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea')
                ->where('tu.idUsuario', $idUsuario)
                ->whereDate('t.fechaEntrega', '=', $fecha)
                ->select(
                    'm.nombreMateria as materia',
                    'tt.nombreTareasTipos as tipo_tarea',
                    't.*'
                )
                ->orderBy('t.fechaEntrega', 'asc')
                ->get();

            return response()->json($tareas);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al obtener las tareas por fecha de entrega: ' . $e->getMessage()], 500);
        }
    }

    public function getTareasPorFechaAsignacion($fecha, $idUsuario)
    {
        try {
            $tareas = DB::table('tareas as t')
                ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria')
                ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos')
                ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea')
                ->where('tu.idUsuario', $idUsuario)
                ->whereDate('t.fechaPublicacion', '=', $fecha)
                ->select(
                    'm.nombreMateria as materia',
                    'tt.nombreTareasTipos as tipo_tarea',
                    't.*'
                )
                ->orderBy('t.fechaPublicacion', 'asc')
                ->get();

            return response()->json($tareas);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al obtener las tareas por fecha de asignación: ' . $e->getMessage()], 500);
        }
    }

    public function getMateriasUsuarioUltimos30Dias($idUsuario)
    {
        try {
            $materias = DB::table('tareas as t')
                ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria')
                ->join('tareas_usuarios_colegioabc as tu', 't.idTarea', '=', 'tu.idTarea')
                ->where('tu.idUsuario', $idUsuario)
                ->where('t.fechaPublicacion', '>=', now()->subDays(30))
                ->select(
                    'm.idMateria',
                    'm.nombreMateria'
                )
                ->distinct()
                ->orderBy('m.nombreMateria', 'asc')
                ->get();

            return response()->json($materias);

        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al obtener las materias: ' . $e->getMessage()
            ], 500);
        }
    }

    public function getTareasPorMateria($idMateria)
    {
        try {
            $tareas = DB::table('tareas as t')
                ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria')
                ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos')
                ->where('t.idMateriaTarea', $idMateria)
                ->select(
                    'm.nombreMateria as materia',
                    'tt.nombreTareasTipos as tipo_tarea',
                    't.*'
                )
                ->orderBy('t.fechaPublicacion', 'desc')
                ->get();

            return response()->json($tareas);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al obtener las tareas por materia: ' . $e->getMessage()], 500);
        }
    }



    public function crear(Request $request)
    {

        $carpetaBase = config('custom.s3_carpeta_base');

        $periodoService = new PeriodoService();
        $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre();

        $rutaBucket = 'tareas/';

        try {
            // Procesar adjuntoTarea (por si mandas archivos en base64 como en circulares)
            $adjuntos = [];

            if ($request->has('bases64')) {
                foreach ($request->bases64 as $file) {
                    $fileInfo = explode(';', $file['base64'])[0];
                    $fileExtension = explode('/', $fileInfo)[1];

                    switch ($fileExtension) {
                        case 'vnd.openxmlformats-officedocument.wordprocessingml.document':
                            $fileExtension = 'docx';
                            break;
                        case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet':
                            $fileExtension = 'xlsx';
                            break;
                        case 'vnd.openxmlformats-officedocument.presentationml.presentation':
                            $fileExtension = 'pptx';
                            break;
                    }

                    $fileData = substr($file['base64'], strpos($file['base64'], ',') + 1);
                    $fileData = str_replace(' ', '+', $fileData);
                    $contenidoArchivo = base64_decode($fileData);

                    $fileName = $file['id'] . '-' . $file['nombre'] . '.' . $fileExtension;
                    $pathS3 = $carpetaBase . '/' . $carpetaPeriodo . '/' . $rutaBucket . $fileName;

                    // Subir al s3
                    Storage::disk('s3')->put($pathS3, $contenidoArchivo, 'public');

                    $adjuntos[] = [
                        'id' => $file['id'],
                        'nombre' => $file['nombre'],
                        'ruta' => Storage::disk('s3')->url($pathS3)
                    ];
                }
            }

            // Insertar tarea en la base de datos
            DB::table('tareas')->insert([
                'idEscuela' => 'COlEGIOABC',
                'idMateriaTarea' => $request->idMateriaTarea,
                'idTipoTarea' => $request->idTipoTarea,
                'tituloTarea' => $request->tituloTarea,
                'descripcionTarea' => $request->descripcionTarea,
                'vinculoTarea' => $request->vinculoTarea,
                'adjuntoTarea' => json_encode($adjuntos),
                'fechaPublicacion' => $request->fechaPublicacion,
                'fechaEntrega' => $request->fechaEntrega,
                'estado' => 'Completa',
                // estos por default en 'No' si no vienen en la request
                'entregaDigital' => $request->entregaDigital ?? 'No',
                'calificacion' => $request->calificacion ?? 'No',
                'retroalimentacion' => $request->retroalimentacion ?? 'No',
                'descargarTareas' => $request->descargarTareas ?? 'No',
                'idUsuario' => $request->idUsuario,
            ]);

            return response()->json([
                'mensaje' => 'Tarea creada exitosamente',
                'idTarea' => DB::getPdo()->lastInsertId()
            ], 201);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al crear la tarea: ' . $e->getMessage()], 500);
        }
    }

    public function actualizar(Request $request, $idTarea)
    {
        $carpetaBase = config('custom.s3_carpeta_base');

        $periodoService = new PeriodoService();
        $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre();

        $rutaBucket = 'tareas/';

        try {
            // Recuperar tarea existente
            $tareaExistente = DB::table('tareas')->where('idTarea', $idTarea)->first();
            if (!$tareaExistente) {
                return response()->json(['mensaje' => 'Tarea no encontrada'], 404);
            }

            // Adjuntos (si vienen)
            $adjuntos = json_decode($tareaExistente->adjuntoTarea ?? '[]', true);

            if ($request->has('bases64')) {
                foreach ($request->bases64 as $file) {
                    $fileInfo = explode(';', $file['base64'])[0];
                    $fileExtension = explode('/', $fileInfo)[1];

                    switch ($fileExtension) {
                        case 'vnd.openxmlformats-officedocument.wordprocessingml.document':
                            $fileExtension = 'docx';
                            break;
                        case 'vnd.openxmlformats-officedocument.spreadsheetml.sheet':
                            $fileExtension = 'xlsx';
                            break;
                        case 'vnd.openxmlformats-officedocument.presentationml.presentation':
                            $fileExtension = 'pptx';
                            break;
                    }

                    $fileData = substr($file['base64'], strpos($file['base64'], ',') + 1);
                    $fileData = str_replace(' ', '+', $fileData);
                    $contenidoArchivo = base64_decode($fileData);

                    $fileName = $file['id'] . '-' . $file['nombre'] . '.' . $fileExtension;
                    $pathS3 = $carpetaBase . '/' . $carpetaPeriodo . '/' . $rutaBucket . $fileName;

                    Storage::disk('s3')->put($pathS3, $contenidoArchivo, 'public');

                    $adjuntos[] = [
                        'id' => $file['id'],
                        'nombre' => $file['nombre'],
                        'ruta' => Storage::disk('s3')->url($pathS3)
                    ];
                }
            }

            // Actualizar tarea en DB
            DB::table('tareas')
                ->where('idTarea', $idTarea)
                ->update([
                    'idMateriaTarea' => $request->idMateriaTarea ?? $tareaExistente->idMateriaTarea,
                    'idTipoTarea' => $request->idTipoTarea ?? $tareaExistente->idTipoTarea,
                    'tituloTarea' => $request->tituloTarea ?? $tareaExistente->tituloTarea,
                    'descripcionTarea' => $request->descripcionTarea ?? $tareaExistente->descripcionTarea,
                    'vinculoTarea' => $request->vinculoTarea ?? $tareaExistente->vinculoTarea,
                    'adjuntoTarea' => json_encode($adjuntos),
                    'fechaPublicacion' => $request->fechaPublicacion ?? $tareaExistente->fechaPublicacion,
                    'fechaEntrega' => $request->fechaEntrega ?? $tareaExistente->fechaEntrega,
                    'entregaDigital' => $request->entregaDigital ?? $tareaExistente->entregaDigital,
                    'calificacion' => $request->calificacion ?? $tareaExistente->calificacion,
                    'retroalimentacion' => $request->retroalimentacion ?? $tareaExistente->retroalimentacion,
                    'descargarTareas' => $request->descargarTareas ?? $tareaExistente->descargarTareas,
                    'estado' => $request->estado ?? $tareaExistente->estado,
                    'idUsuario' => $request->idUsuario ?? $tareaExistente->idUsuario,
                ]);

            return response()->json([
                'mensaje' => 'Tarea actualizada exitosamente',
                'idTarea' => $idTarea
            ], 200);
        } catch (\Exception $e) {
            return response()->json(['mensaje' => 'Error al actualizar la tarea: ' . $e->getMessage()], 500);
        }
    }


    public function obtenerAlumnosPorMateria($idMateria)
    {
        // Primero obtenemos el grado o grupo relacionado con la materia
        $materia = DB::table('vista_materias_grados_grupos')
            ->where('idMateria', $idMateria)
            ->first();

        if (!$materia) {
            return collect(); // Si no existe la materia
        }

        $idRelacionado = $materia->idGradoGrupoRelacionado;

        // --- Caso 1: Coincide con el grado del usuario ---
        $alumnosPorGrado = DB::table('usuarios')
            ->where('grado', $idRelacionado)
            ->where('tipoUsuario', 'AL') // solo alumnos
            ->where('estatus', 'Activo')
            ->get();

        // --- Caso 2: Coincide con un grupo ---
        $alumnosPorGrupo = DB::table('usuarios')
            ->join('grupos', 'usuarios.idUsuario', '=', 'grupos.idUsuario')
            ->where('grupos.idGrupo', $idRelacionado)
            ->where('usuarios.tipoUsuario', 'AL')
            ->where('usuarios.estatus', 'Activo')
            ->select('usuarios.*')
            ->get();

        // Unimos los resultados
        return $alumnosPorGrado->merge($alumnosPorGrupo);
    }

    public function asignarTareaUsuario(Request $request)
    {

        // Insertar con Query Builder
        DB::table('tareas_usuarios_colegioabc')->insert([
            'idTarea' => $request->idTarea,
            'idUsuario' => $request->idUsuario,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Tarea asignada al usuario correctamente',
        ], 201);
    }

    public function getTareasPorUsuario($idUsuario)
    {
        try {
            $tareas = DB::table('tareas_usuarios_colegioabc as tu')
                ->join('tareas as t', 'tu.idTarea', '=', 't.idTarea')
                ->join('materias as m', 't.idMateriaTarea', '=', 'm.idMateria')
                ->join('tareas_tipos as tt', 't.idTipoTarea', '=', 'tt.idTareasTipos')
                ->where('tu.idUsuario', $idUsuario)
                ->select(
                    'm.nombreMateria as materia',
                    'tt.nombreTareasTipos as tipo_tarea',
                    't.*', // todos los campos de tareas
                    'tu.idUsuario as usuario_asignado' // opcional, por si quieres saber a qué usuario está asignada
                )
                ->orderBy('t.fechaPublicacion', 'desc')
                ->get();

            return response()->json($tareas);
        } catch (\Exception $e) {
            return response()->json([
                'mensaje' => 'Error al obtener las tareas: ' . $e->getMessage()
            ], 500);
        }
    }

    public function habilitar($id)
    {

        try {
            //code...
            DB::table('tareas')
                ->updateOrInsert(
                    ['idTarea' => $id],
                    ['estado' => 'Completa']
                );

            return response()->json(['mensaje' => 'Tarea habilitada exitosamente'], 201);
        } catch (\Exception $e) {
            //throw $th;
            return response()->json(['mensaje' => 'Error al habilitar la tarea: ' . $e->getMessage()], 500);
        }

    }
    public function eliminar($id)
    {
        try {
            //code...
            DB::table('tareas')
                ->updateOrInsert(
                    ['idTarea' => $id],
                    ['estado' => 'Eliminada']
                );

            return response()->json(['mensaje' => 'Tarea eliminada exitosamente'], 201);
        } catch (\Exception $e) {
            //throw $th;
            return response()->json(['mensaje' => 'Error al eliminar la tarea: ' . $e->getMessage()], 500);
        }

    }


}