package es.tatvil.taiageweb.controlador;

import com.stripe.exception.StripeException;
import com.stripe.model.checkout.Session;
import com.stripe.param.checkout.SessionCreateParams;
import es.tatvil.taiageweb.repositorio.UsuarioRepository;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class PagoController {

    @Value("${stripe.price-amount}")
    private long priceAmount;

    @Value("${stripe.currency}")
    private String currency;

    private final UsuarioRepository usuarioRepo;

    public PagoController(UsuarioRepository usuarioRepo) {
        this.usuarioRepo = usuarioRepo;
    }

    /** Página informativa con precio y botón "Pagar ahora" */
    @GetMapping("/pagar")
    public String mostrarPagina(Authentication auth, Model model) {
        // Si ya tiene acceso, redirigir directo al curso
        if (auth != null && auth.getAuthorities().stream()
                .anyMatch(a -> a.getAuthority().equals("ROLE_PAGADO"))) {
            return "redirect:/curso";
        }
        model.addAttribute("precio", String.format("%.2f", priceAmount / 100.0));
        return "pagar";
    }

    /** Crea la sesión de pago en Stripe y redirige a su pasarela */
    @PostMapping("/pagar/iniciar")
    public String iniciarPago(Authentication auth, HttpServletRequest request) throws StripeException {
        String baseUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();

        UserDetails userDetails = (UserDetails) auth.getPrincipal();
        var usuario = usuarioRepo.findByEmail(userDetails.getUsername()).orElseThrow();

        SessionCreateParams params = SessionCreateParams.builder()
                .setMode(SessionCreateParams.Mode.PAYMENT)
                .setSuccessUrl(baseUrl + "/pagar/exito?session_id={CHECKOUT_SESSION_ID}")
                .setCancelUrl(baseUrl + "/pagar/cancelado")
                .setClientReferenceId(String.valueOf(usuario.getId()))
                .setCustomerEmail(usuario.getEmail())
                .addLineItem(SessionCreateParams.LineItem.builder()
                        .setQuantity(1L)
                        .setPriceData(SessionCreateParams.LineItem.PriceData.builder()
                                .setCurrency(currency)
                                .setUnitAmount(priceAmount)
                                .setProductData(SessionCreateParams.LineItem.PriceData.ProductData.builder()
                                        .setName("Acceso completo al curso TAI – AGE")
                                        .setDescription("Acceso permanente a todos los temas, apuntes y actualizaciones")
                                        .build())
                                .build())
                        .build())
                .build();

        Session session = Session.create(params);
        return "redirect:" + session.getUrl();
    }

    @GetMapping("/pagar/exito")
    public String exitoPago() {
        return "pago-exito";
    }

    @GetMapping("/pagar/cancelado")
    public String canceladoPago() {
        return "pago-cancelado";
    }
}
