<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Course;
use App\Models\CourseContent;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class CourseContentController extends Controller
{
    public function index(Course $course)
    {
        // Traemos el curso con sus contenidos cargados para listarlos
        $contents = $course->contents;
        return view('admin.courses.contents', compact('course', 'contents'));
    }

    public function store(Request $request, Course $course)
    {
        $request->validate([
            'title' => 'required|max:255',
            'type' => 'required|in:video,audio,document',
            'description' => 'nullable|max:500',
            'file' => 'required_if:type,audio,document|file|max:20480', // El archivo es obligatorio si es audio o documento
            'video_id' => 'required_if:type,video|nullable|string|max:255'
        ]);

        $path = '';

        // CASO 1: Es una videoclase local subida como archivo
        if ($request->type === 'video' && $request->hasFile('file')) {
            $folder = "contents/course-{$course->id}/video";
            $path = $request->file('file')->store($folder, 'public'); // El video local DEBE ir a 'public'
        } 
        // CASO 2: Es un video insertado por ID (YouTube/Vimeo/Bunny)
        elseif ($request->type === 'video' && $request->filled('video_id')) {
            $path = $request->video_id;
        }
        // CASO 3: Son archivos de Audio o Documento PDF (Van al disco privado 'local')
        elseif ($request->hasFile('file')) {
            $folder = "contents/course-{$course->id}/{$request->type}";
            $path = $request->file('file')->store($folder, 'local'); // Cambiado a 'local' para protegerlos
        } else {
            return redirect()->back()->with('error', 'Por favor, introduce un ID de video o sube un archivo válido.');
        }

        // Guardamos el registro en la base de datos con la ruta del disco correspondiente
        CourseContent::create([
            'course_id' => $course->id,
            'title' => $request->title,
            'type' => $request->type,
            'description' => $request->description,
            'file_path' => $path,
            'order' => $course->contents()->count() + 1
        ]);

        return redirect()->back()->with('success', 'Contenido educativo agregado con éxito.');
    }

    public function edit(CourseContent $content)
    {
        // Buscamos el curso al que pertenece este contenido de forma explícita
        $course = \App\Models\Course::find($content->course_id);

        if (!$course) {
            abort(404, 'El curso asociado a este contenido no existe.');
        }

        return view('admin.courses.contents_edit', compact('content', 'course'));
    }

    public function update(Request $request, CourseContent $content)
    {
        $request->validate([
            'title' => 'required|max:255',
            'type' => 'required|in:video,audio,document',
            'description' => 'nullable|max:500',
            'file' => 'nullable|file|max:20480', 
            'video_id' => 'required_if:type,video|nullable|string|max:255'
        ]);

        $data = $request->only(['title', 'type', 'description']);

        if ($request->type === 'video' && $request->filled('video_id')) {
            $data['file_path'] = $request->video_id;
        } 
        
        if ($request->hasFile('file')) {
            // Borramos el archivo anterior del disco correcto según su tipo original
            if ($content->type === 'video') {
                Storage::disk('public')->delete($content->file_path);
            } else {
                Storage::disk('local')->delete($content->file_path);
            }

            // Subimos el nuevo archivo discriminando el destino
            $folder = "contents/course-{$content->course_id}/{$request->type}";
            $disk = $request->type === 'video' ? 'public' : 'local';
            $data['file_path'] = $request->file('file')->store($folder, $disk);
        }

        $content->update($data);

        return redirect()->route('admin.courses.contents.index', $content->course_id)
                        ->with('success', 'Contenido del temario actualizado correctamente.');
    }

    public function destroy(CourseContent $content)
    {
        $courseId = $content->course_id;

        if ($content->type === 'video') {
            if (str_contains($content->file_path, '/')) {
                Storage::disk('public')->delete($content->file_path);
            }
        } else {
            Storage::disk('local')->delete($content->file_path);
        }

        $content->delete();

        // Reordenar secuencialmente
        $contents = CourseContent::where('course_id', $courseId)->orderBy('order')->get();
        foreach ($contents as $index => $item) {
            $item->update(['order' => $index + 1]);
        }

        return redirect()->route('admin.courses.contents.index', $courseId)
                        ->with('success', 'La lección ha sido eliminada del temario de forma permanente.');
    }
}