package handler

import (
	"errors"
	"time"

	"git.coopgo.io/coopgo-platform/solidarity-transport/types"
	"github.com/google/uuid"
	"github.com/rs/zerolog/log"
)

func (h Handler) BookDriverJourney(passengerid string, driverid string, journeyid string) error {
	journey, err := h.Storage.GetDriverJourney(journeyid)
	if err != nil {
		log.Error().Err(err).Msg("could not find driver journey")
		return err
	}

	if journey.DriverId != driverid {
		return errors.New("not authorized : journey id driver and driverid mismatch")
	}

	booking := types.Booking{
		Id:          uuid.NewString(),
		GroupId:     uuid.NewString(),
		Status:      "WAITING_CONFIRMATION",
		PassengerId: passengerid,
		DriverId:    driverid,
		Journey:     journey,
	}

	if err := h.Storage.CreateBooking(booking); err != nil {
		log.Error().Err(err).Msg("error creating booking")
		return err
	}

	return nil
}

func (h Handler) GetBookings(startdate time.Time, enddate time.Time) ([]*types.Booking, error) {
	res := []*types.Booking{}

	bookings, err := h.Storage.GetAllBookings()
	if err != nil {
		log.Error().Err(err).Msg("error retrieving bookings")
		return nil, err
	}

	for _, b := range bookings {
		if b.Journey.DriverDepartureDate.After(startdate) && b.Journey.DriverDepartureDate.Before(enddate) {
			res = append(res, b)
		}
	}
	return res, nil
}

func (h Handler) GetBooking(id string) (*types.Booking, error) {
	booking, err := h.Storage.GetBooking(id)
	if err != nil {
		log.Error().Err(err).Msg("could not get booking")
		return nil, err
	}

	return booking, nil
}

func (h Handler) UpdateBookingStatus(bookingid string, newStatus string) error {
	if err := h.Storage.UpdateBookingStatus(bookingid, newStatus); err != nil {
		log.Error().Err(err).Msg("could not update booking")
		return err
	}
	return nil
}