OLDTiendaService - Dsoledispa/DSA-PROJECTE GitHub Wiki

package edu.upc.dsa.services;

import edu.upc.dsa.manager.TiendaManager;
import edu.upc.dsa.manager.TiendaManagerImpl;
import edu.upc.dsa.models.CompraRequest;
import edu.upc.dsa.models.Producto;
import edu.upc.dsa.models.Seccion;
import edu.upc.dsa.config.IniciarDatos;
import io.swagger.annotations.*;
import org.apache.log4j.Logger;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Api(value = "/tienda", description = "Servicio de tienda")
@Path("/tienda")
public class TiendaService {

    final static Logger logger = Logger.getLogger(TiendaService.class);
    private final TiendaManager tm;

    public TiendaService() {
        this.tm = TiendaManagerImpl.getInstance();
        IniciarDatos.init(); // Asegurarse de que los datos están cargados
    }

    @GET
    @ApiOperation(value = "Listar todos los productos", notes = "Productos disponibles en la tienda")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "OK", response = Producto.class, responseContainer = "List")
    })
    @Path("/productos")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAllProductos() {
        return Response.status(200).entity(this.tm.listarProductos()).build();
    }

    @GET
    @ApiOperation(value = "Buscar productos por nombre", notes = "Devuelve productos que contienen el nombre buscado")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "OK", response = Producto.class, responseContainer = "List")
    })
    @Path("/productos/buscar")
    @Produces(MediaType.APPLICATION_JSON)
    public Response buscarProductosPorNombre(@QueryParam("nombre") String nombre) {
        return Response.status(200).entity(this.tm.buscarProductosPorNombre(nombre)).build();
    }

    @GET
    @ApiOperation(value = "Buscar producto por ID", notes = "Producto específico por ID")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "OK", response = Producto.class),
            @ApiResponse(code = 404, message = "Producto no encontrado")
    })
    @Path("/productos/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response buscarProductoPorId(@PathParam("id") String idProducto) {
        Producto p = this.tm.buscarProductoPorId(idProducto);
        if (p != null)
            return Response.status(200).entity(p).build();
        else
            return Response.status(404).entity("{\"error\":\"Producto no encontrado\"}").build();
    }

    @GET
    @ApiOperation(value = "Listar productos de una sección", notes = "Productos de una sección específica")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "OK", response = Producto.class, responseContainer = "List")
    })
    @Path("/productos/seccion/{nombre}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response listarProductosPorSeccion(@PathParam("nombre") String nombreSeccion) {
        return Response.status(200).entity(this.tm.listarProductosPorSeccion(nombreSeccion)).build();
    }

    @POST
    @ApiOperation(value = "Añadir producto a una sección", notes = "Crea un nuevo producto en la sección especificada")
    @ApiResponses(value = {
            @ApiResponse(code = 201, message = "Producto añadido correctamente"),
            @ApiResponse(code = 400, message = "Faltan datos o sección inválida")
    })
    @Path("/productos/seccion/{seccion}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response addProductoASeccion(@PathParam("seccion") String nombreSeccion, Producto producto) {
        if (producto.getId() == null || producto.getNombre() == null || producto.getPrecio() <= 0) {
            return Response.status(400).entity("{\"error\":\"Datos del producto incompletos o inválidos\"}").build();
        }
        this.tm.addProductoASeccion(nombreSeccion, producto);
        return Response.status(201).entity("{\"mensaje\":\"Producto añadido correctamente\"}").build();
    }

    @POST
    @ApiOperation(value = "Comprar un producto", notes = "Compra un producto específico")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Compra realizada"),
            @ApiResponse(code = 404, message = "Usuario o producto no encontrado")
    })
    @Path("/productos/comprar")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response comprarProducto(CompraRequest request) {
        boolean comprado = this.tm.comprarProducto(request.getIdProducto(), request.getNombreUsuario());
        if (comprado)
            return Response.status(200).entity("{\"mensaje\":\"Producto comprado con éxito\"}").build();
        else
            return Response.status(404).entity("{\"error\":\"Usuario o producto no encontrado\"}").build();
    }

    @GET
    @ApiOperation(value = "Listar todas las secciones", notes = "Devuelve todas las secciones disponibles")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "OK", response = Seccion.class, responseContainer = "List")
    })
    @Path("/secciones")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAllSecciones() {
        return Response.status(200).entity(this.tm.getSecciones()).build();
    }

    @DELETE
    @ApiOperation(value = "Eliminar producto de una sección", notes = "Elimina un producto de la sección especificada por su ID")
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Producto eliminado correctamente"),
            @ApiResponse(code = 404, message = "Producto no encontrado")
    })
    @Path("/productos/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response eliminarProducto(@PathParam("id") String idProducto) {
        Producto producto = this.tm.buscarProductoPorId(idProducto);
        if (producto != null) {
            this.tm.eliminarProducto(idProducto);
            return Response.status(200).entity("{\"mensaje\":\"Producto eliminado correctamente\"}").build();
        } else {
            return Response.status(404).entity("{\"error\":\"Producto no encontrado\"}").build();
        }
    }

}