<?php

namespace App\Http\Controllers\Administracion;

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

class ProcesoAdmisionResultadoArchivoController extends Controller
{
    public function index(int $procesoId)
    {
        $archivos = ProcesoAdmisionResultadoArchivo::where('proceso_admision_id', $procesoId)
            ->orderBy('orden')
            ->get();

        return response()->json($archivos);
    }

    public function store(Request $request, int $procesoId)
    {
        $request->validate([
            'orden'   => 'required|integer|min:1|max:6',
            'nombre'  => 'required|string|max:255',
            'archivo' => 'required|file|mimes:txt|max:10240',
        ]);

        // Máximo 6 archivos por proceso
        $count = ProcesoAdmisionResultadoArchivo::where('proceso_admision_id', $procesoId)->count();
        if ($count >= 6) {
            return response()->json(['message' => 'Máximo 6 archivos por proceso.'], 422);
        }

        // No puede haber dos archivos con el mismo orden en el mismo proceso
        $existe = ProcesoAdmisionResultadoArchivo::where('proceso_admision_id', $procesoId)
            ->where('orden', $request->orden)
            ->exists();
        if ($existe) {
            return response()->json(['message' => 'Ya existe un archivo para ese slot.'], 422);
        }

        $contenido  = file_get_contents($request->file('archivo')->getRealPath());
        $encoding   = mb_detect_encoding($contenido, ['UTF-8', 'Windows-1252', 'ISO-8859-1'], true);
        $contenidoUtf8 = ($encoding === 'UTF-8')
            ? $contenido
            : mb_convert_encoding($contenido, 'UTF-8', $encoding ?: 'Windows-1252');
        $filename = uniqid() . '.txt';
        $path     = "proceso-resultados/{$procesoId}/{$filename}";
        \Storage::disk('public')->put($path, $contenidoUtf8);

        $archivo = ProcesoAdmisionResultadoArchivo::create([
            'proceso_admision_id' => $procesoId,
            'nombre'              => $request->nombre,
            'file_path'           => $path,
            'orden'               => $request->orden,
        ]);

        return response()->json($archivo, 201);
    }

    public function destroy(int $id)
    {
        $archivo = ProcesoAdmisionResultadoArchivo::findOrFail($id);

        Storage::disk('public')->delete($archivo->file_path);
        $archivo->delete();

        return response()->json(['message' => 'Eliminado correctamente.']);
    }
}
