package handlers import ( "log/slog" "strconv" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/event" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/odds" "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response" "github.com/gofiber/fiber/v2" ) // GetPrematchOdds godoc // @Summary Retrieve prematch odds for an event // @Description Retrieve prematch odds for a specific event by event ID // @Tags prematch // @Accept json // @Produce json // @Param event_id path string true "Event ID" // @Success 200 {array} domain.Odd // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /prematch/odds/{event_id} [get] func GetPrematchOdds(logger *slog.Logger, prematchSvc *odds.ServiceImpl) fiber.Handler { return func(c *fiber.Ctx) error { eventID := c.Params("event_id") if eventID == "" { return response.WriteJSON(c, fiber.StatusBadRequest, "Missing event_id", nil, nil) } odds, err := prematchSvc.GetPrematchOdds(c.Context(), eventID) if err != nil { return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve odds", nil, nil) } return response.WriteJSON(c, fiber.StatusOK, "Prematch odds retrieved successfully", odds, nil) } } //GetALLPrematchOdds // @Summary Retrieve all prematch odds // @Description Retrieve all prematch odds from the database // @Tags prematch // @Accept json // @Produce json // @Success 200 {array} domain.Odd // @Failure 500 {object} response.APIResponse // @Router /prematch/odds [get] func GetALLPrematchOdds(logger *slog.Logger, prematchSvc *odds.ServiceImpl) fiber.Handler { return func(c *fiber.Ctx) error { odds, err := prematchSvc.GetALLPrematchOdds(c.Context()) if err != nil { return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve all prematch odds", nil, nil) } return response.WriteJSON(c, fiber.StatusOK, "All prematch odds retrieved successfully", odds, nil) } } // GetRawOddsByID // @Summary Retrieve raw odds by ID // @Description Retrieve raw odds by raw odds ID // @Tags prematch // @Accept json // @Produce json // @Param raw_odds_id path string true "Raw Odds ID" // @Success 200 {object} domain.RawOddsByID // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /prematch/odds/raw/{raw_odds_id} [get] func GetRawOddsByID(logger *slog.Logger, prematchSvc *odds.ServiceImpl) fiber.Handler { return func(c *fiber.Ctx) error { rawOddsID := c.Params("raw_odds_id") if rawOddsID == "" { return response.WriteJSON(c, fiber.StatusBadRequest, "Missing raw_odds_id", nil, nil) } rawOdds, err := prematchSvc.GetRawOddsByID(c.Context(), rawOddsID) if err != nil { return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve raw odds", nil, nil) } return response.WriteJSON(c, fiber.StatusOK, "Raw odds retrieved successfully", rawOdds, nil) } } // @Summary Retrieve all upcoming events // @Description Retrieve all upcoming events from the database // @Tags prematch // @Accept json // @Produce json // @Success 200 {array} domain.UpcomingEvent // @Failure 500 {object} response.APIResponse // @Router /prematch/events [get] func GetAllUpcomingEvents(logger *slog.Logger, eventSvc event.Service) fiber.Handler { return func(c *fiber.Ctx) error { events, err := eventSvc.GetAllUpcomingEvents(c.Context()) if err != nil { return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve all upcoming events", nil, nil) } return response.WriteJSON(c, fiber.StatusOK, "All upcoming events retrieved successfully", events, nil) } } // @Summary Retrieve an upcoming by ID // @Description Retrieve an upcoming event by ID // @Tags prematch // @Accept json // @Produce json // @Param id path string true "ID" // @Success 200 {object} domain.UpcomingEvent // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /prematch/events/{id} [get] func GetUpcomingEventByID(logger *slog.Logger, eventSvc event.Service) fiber.Handler { return func(c *fiber.Ctx) error { id := c.Params("id") if id == "" { return response.WriteJSON(c, fiber.StatusBadRequest, "Missing id", nil, nil) } event, err := eventSvc.GetUpcomingEventByID(c.Context(), id) if err != nil { return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve upcoming event", nil, nil) } return response.WriteJSON(c, fiber.StatusOK, "Upcoming event retrieved successfully", event, nil) } } // @Summary Retrieve prematch odds by upcoming ID (FI) // @Description Retrieve prematch odds by upcoming event ID (FI from Bet365) with optional pagination // @Tags prematch // @Accept json // @Produce json // @Param upcoming_id path string true "Upcoming Event ID (FI)" // @Param limit query int false "Number of results to return (default: 10)" // @Param offset query int false "Number of results to skip (default: 0)" // @Success 200 {array} domain.Odd // @Failure 400 {object} response.APIResponse // @Failure 500 {object} response.APIResponse // @Router /prematch/odds/upcoming/{upcoming_id} [get] func GetPrematchOddsByUpcomingID(logger *slog.Logger, prematchSvc *odds.ServiceImpl) fiber.Handler { return func(c *fiber.Ctx) error { upcomingID := c.Params("upcoming_id") if upcomingID == "" { return response.WriteJSON(c, fiber.StatusBadRequest, "Missing upcoming_id", nil, nil) } limit, err := strconv.Atoi(c.Query("limit", "10")) // Default limit is 10 if err != nil || limit <= 0 { return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid limit value", nil, nil) } offset, err := strconv.Atoi(c.Query("offset", "0")) // Default offset is 0 if err != nil || offset < 0 { return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid offset value", nil, nil) } odds, err := prematchSvc.GetPrematchOddsByUpcomingID(c.Context(), upcomingID, int32(limit), int32(offset)) if err != nil { return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve prematch odds", nil, nil) } return response.WriteJSON(c, fiber.StatusOK, "Prematch odds retrieved successfully", odds, nil) } }