<?php

namespace App\Controllers;

use App\Models\MembresiaModel;
use App\Models\ClienteMembresiaModel;
use App\Models\UsuarioModel;
use App\Entities\ClienteMembresia as ClienteMembresiaEntity;

class Membresia extends BaseController
{
    /**
     * Muestra el formulario de pago simulado para suscribirse a un plan de membresía.
     * Reutiliza el mismo método de pago (tarjeta simulada) que la compra de entradas.
     */
    public function pago($id_membresia)
    {
        if (!session()->get('isLoggedIn')) {
            return redirect()->to(base_url('login'))->with('error', 'Por favor, inicia sesión para suscribirte a una membresía.');
        }

        $membresiaModel = new MembresiaModel();
        $membresia = $membresiaModel->find($id_membresia);

        if (!$membresia) {
            return redirect()->to(base_url('membresia'))->with('error', 'El plan de membresía solicitado no existe.');
        }

        // Avisar si el usuario ya cuenta con una membresía vigente.
        $cmModel = new ClienteMembresiaModel();
        $activa = $cmModel->getMembresiaActiva(session()->get('user_id'));

        return view('home/membresia/pago', [
            'membresia'  => $membresia,
            'yaEsMiembro' => $activa !== null,
            'membresiaActualNombre' => $activa->membresia_nombre ?? null,
            'carrito' => carrito_snapshot(),
        ]);
    }

    /**
     * Valida el pago simulado y activa la membresía del cliente por 1 mes.
     */
    public function confirmar()
    {
        if (!session()->get('isLoggedIn')) {
            return redirect()->to(base_url('login'));
        }

        $id_membresia = $this->request->getPost('id_membresia');

        $membresiaModel = new MembresiaModel();
        $membresia = $membresiaModel->find($id_membresia);

        if (!$membresia) {
            return redirect()->to(base_url('membresia'))->with('error', 'El plan de membresía solicitado no existe.');
        }

        // Mismas validaciones de tarjeta que se usan para la compra de entradas.
        $rules = [
            'numero_tarjeta'     => 'required',
            'nombre_titular'     => 'required|min_length[3]|max_length[100]',
            'fecha_vencimiento'  => 'required',
            'cvv'                => 'required|numeric|min_length[3]|max_length[4]'
        ];

        if (!$this->validate($rules)) {
            return redirect()->back()->withInput()->with('error', 'Por favor, verifique los datos de su tarjeta.');
        }

        // Verificar que el usuario todavía exista (misma protección que en Reserva::confirmar).
        $userModel = new UsuarioModel();
        $usuario = $userModel->find(session()->get('user_id'));
        if (!$usuario) {
            session()->destroy();
            return redirect()->to(base_url('login'))
                             ->with('error', 'Tu sesión ya no es válida. Por favor, inicia sesión nuevamente.');
        }

        $cmModel = new ClienteMembresiaModel();

        $cm = new ClienteMembresiaEntity();
        $cm->id_usuario   = $usuario->id_usuario;
        $cm->id_membresia = $membresia->id_membresia;
        $cm->puntos       = 0;
        $cm->fecha_inicio = date('Y-m-d');
        $cm->fecha_fin    = date('Y-m-d', strtotime('+1 month'));

        if (!$cmModel->save($cm)) {
            log_message('error', 'No se pudo guardar la membresía del cliente: ' . implode(' ', $cmModel->errors()));
            return redirect()->to(base_url('membresia'))
                             ->with('error', 'Ocurrió un problema al procesar tu pago y la membresía no se activó. Por favor, intenta nuevamente.');
        }

        return redirect()->to(base_url('membresia'))
                         ->with('success', '¡Listo! Ahora eres miembro ' . esc($membresia->nombre) . '. Tu descuento de ' . $membresia->descuento_pct . '% se aplicará automáticamente en tus próximas compras de entradas y productos.');
    }
}
