<?php
namespace App\Controllers;

use App\Models\Assignment;
use App\Models\User;
use App\Services\RotationService;
use App\Middleware\RoleMiddleware;
use App\Helpers\Response;

class AssignmentController
{
    private $assignmentModel;
    private $rotationService;
    
    public function __construct()
    {
        $this->assignmentModel = new Assignment();
        $this->rotationService = new RotationService();
    }
    
    public function index()
    {
        // Vista pública de rotaciones
        // Paginación simple
        $page = get('page', 1);
        $limit = 10; // Semanas por página
        // Nota: Implementar paginación completa en modelo si es necesario (OFFSET)
        // Por ahora obtenemos todas las futuras y cortamos en vista o añadimos método paginado en modelo
        
        // Usamos getUpcoming que ya tiene un limit, o implementamos paginacion real.
        // Para simplificar: mostramos las próximas 12 semanas siempre.
        return $this->assignmentModel->getUpcoming(12);
    }
    
    public function generate()
    {
        // Permitir a Administradores y Coordinadores
        RoleMiddleware::coordinador();
        
        if (isPost()) {
            if (!verifyCsrfToken(post('csrf_token'))) {
                flash('error', 'Token inválido');
                redirect(siteUrl('admin/generar-rotacion.php'));
            }
            
            $type = post('type'); // 'extend' or 'regenerate'
            $weeks = (int)post('weeks', 8);
            
            if ($type === 'regenerate') {
                error_log("Iniciando regeneración desde controlador...");
                // Usar el nuevo método que respeta el orden maestro
                try {
                    $count = $this->rotationService->regenerateFutureFromOrder();
                    error_log("Regeneración exitosa: $count semanas");
                } catch (\Throwable $e) {
                    error_log("ERROR CRÍTICO en regeneración: " . $e->getMessage() . "\n" . $e->getTraceAsString());
                    flash('error', "Error interno: " . $e->getMessage());
                    redirect(siteUrl('rotaciones.php'));
                }
                flash('success', "Rotación regenerada basándose en el orden maestro ($count semanas).");
            } else {
                $count = $this->rotationService->generateNext($weeks);
                flash('success', "Se han generado $count nuevas semanas de rotación.");
            }
            
            redirect(siteUrl('rotaciones.php'));
        }
    }
    
    public function getHelpersForReorder()
    {
        // Endpoint AJAX para drag & drop
        RoleMiddleware::coordinador();
        
        // Ahora obtenemos USUARIOS únicos, no asignaciones
        $userModel = new User();
        $helpers = $userModel->getAllHelpers(); // Ya vienen ordenados por sort_order
        
        // Retornar JSON puro si se llama via AJAX
        if (isAjax()) {
            Response::success($helpers);
        }
        
        return $helpers;
    }
    
    public function saveOrder()
    {
        // Endpoint AJAX para guardar orden
        RoleMiddleware::coordinador();
        
        if (!isPost()) {
            Response::error('Método no permitido', [], 405);
        }
        
        // Leer JSON input
        $json = file_get_contents('php://input');
        $data = json_decode($json, true);
        
        if (!$data || !isset($data['order'])) {
            Response::error('Datos inválidos');
        }
        
        // $data['order'] es un array de user_ids en el nuevo orden deseado (0..N)
        $userIds = $data['order'];
        
        try {
            $db = \App\Config\Database::getInstance()->getConnection();
            $db->beginTransaction();
            
            $userModel = new User();
            
            // 1. Actualizar sort_order en la tabla users
            foreach ($userIds as $position => $userId) {
                $userModel->updateOrder($userId, $position);
            }
            
            // 2. Regenerar rotaciones futuras basadas en este nuevo orden
            $this->rotationService->regenerateFutureFromOrder();
            
            $db->commit();
            Response::success([], 'Orden maestro actualizado y rotaciones regeneradas');
            
        } catch (\Exception $e) {
            $db->rollBack();
            Response::error('Error al guardar el orden: ' . $e->getMessage());
        }
    }
}
