<?php
/**
 * ASISMA CRM - Configuración Controller
 *
 * Solo el administrador puede ver y modificar la configuración completa
 * (incluye API keys e integraciones). Los demás roles ven parámetros generales
 * en modo lectura.
 */
class ConfiguracionController extends Controller {

    /** Grupos visibles para roles no-admin (solo lectura) */
    private $gruposPublicos = array('general');

    public function index() {
        $db = Database::getInstance();

        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            if (!$this->isAdmin()) {
                $this->json(array('success' => false, 'message' => 'Solo el administrador puede modificar la configuración.'), 403);
            }

            $configs = isset($_POST['config']) ? $_POST['config'] : array();
            if (!is_array($configs) || empty($configs)) {
                $this->json(array('success' => false, 'message' => 'No se recibieron valores para guardar.'));
            }

            // Validaciones específicas
            $errores = array();
            foreach ($configs as $clave => $valor) {
                $valor = trim($valor);
                switch ($clave) {
                    case 'SESSION_TIMEOUT':
                        if (!ctype_digit($valor) || (int)$valor < 300) {
                            $errores[] = 'SESSION_TIMEOUT debe ser un número entero de segundos (mínimo 300).';
                        }
                        break;
                    case 'IMPUESTO_DEFAULT':
                        if (!is_numeric($valor) || (float)$valor < 0 || (float)$valor > 100) {
                            $errores[] = 'IMPUESTO_DEFAULT debe ser un porcentaje entre 0 y 100.';
                        }
                        break;
                    case 'MONEDA_DEFAULT':
                        if ($valor === '' || strlen($valor) > 10) {
                            $errores[] = 'MONEDA_DEFAULT es obligatoria (ej: CLP).';
                        }
                        break;
                    case 'APP_NAME':
                        if ($valor === '') {
                            $errores[] = 'APP_NAME no puede quedar vacío.';
                        }
                        break;
                    case 'CE_PROVISION_URL':
                        if ($valor !== '' && !filter_var($valor, FILTER_VALIDATE_URL)) {
                            $errores[] = 'CE_PROVISION_URL debe ser una URL válida (o vacía para desactivar la integración).';
                        }
                        break;
                    case 'CE_PLANTILLA_ID':
                        if ($valor !== '' && !ctype_digit($valor)) {
                            $errores[] = 'CE_PLANTILLA_ID debe ser un número entero.';
                        }
                        break;
                    case 'CE_EMPRESA_MATRIZ_ID':
                        if ($valor !== '' && !ctype_digit($valor)) {
                            $errores[] = 'CE_EMPRESA_MATRIZ_ID debe ser el ID numérico de la empresa madre en Control Empresas.';
                        }
                        break;
                    case 'CE_LISTA_FRANQUICIADOS_ID':
                        if ($valor !== '' && !ctype_digit($valor)) {
                            $errores[] = 'CE_LISTA_FRANQUICIADOS_ID debe ser el ID numérico de la lista de precios general.';
                        }
                        break;
                }
            }

            if (!empty($errores)) {
                $this->json(array('success' => false, 'message' => implode(' ', $errores)));
            }

            $db->beginTransaction();
            try {
                $actualizadas = 0;
                foreach ($configs as $clave => $valor) {
                    // Solo actualizar claves existentes (no crear arbitrarias desde el form)
                    $existe = $db->fetchOne("SELECT id FROM config_sistema WHERE clave = :clave", array('clave' => $clave));
                    if (!$existe) continue;

                    $db->update('config_sistema', array('valor' => trim($valor)), "clave = :clave", array('clave' => $clave));
                    $actualizadas++;
                }

                AuditHelper::log('update_system_config', 'config_sistema', null, null, array('claves' => array_keys($configs)));
                $db->commit();

                $this->json(array('success' => true, 'message' => "Configuración guardada ({$actualizadas} parámetros)."));
            } catch (Exception $e) {
                $db->rollBack();
                error_log("Error al guardar config: " . $e->getMessage());
                $this->json(array('success' => false, 'message' => 'Error de base de datos al guardar configuración.'));
            }
        }

        // GET: admin ve todo; otros roles solo los grupos públicos
        if ($this->isAdmin()) {
            $configuraciones = $db->fetchAll("SELECT * FROM config_sistema ORDER BY grupo ASC, clave ASC");
        } else {
            $placeholders = "'" . implode("','", $this->gruposPublicos) . "'";
            $configuraciones = $db->fetchAll("SELECT * FROM config_sistema WHERE grupo IN ({$placeholders}) ORDER BY grupo ASC, clave ASC");
        }

        $this->render('config/index', array(
            'title'           => 'Configuración de Sistema',
            'configuraciones' => $configuraciones,
            'puedeEditar'     => $this->isAdmin()
        ));
    }
}
