package server

import (
	"net/http"
	"strconv"

	"github.com/go-chi/chi/v5"
	u "github.com/rjNemo/underscore"

	"github.com/rjNemo/rentease/internal/service/booking"
	"github.com/rjNemo/rentease/internal/view"
)

func handleCreatePayment(bs *booking.Service) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		if err := r.ParseForm(); err != nil {
			http.Error(w, err.Error(), http.StatusBadRequest)
			return
		}

		id, err := strconv.Atoi(chi.URLParam(r, "id"))
		if err != nil {
			http.Error(w, "invalid booking id", http.StatusBadRequest)
			return
		}

		amount := 0.0
		if v := r.FormValue("amount"); v != "" {
			amount, err = strconv.ParseFloat(v, 64)
			if err != nil {
				http.Error(w, "invalid amount", http.StatusBadRequest)
				return
			}
		}

		b := bs.One(id)

		if _, err := bs.CreatePayment(b.ID, amount, r.FormValue("paymentMethod")); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}

		nb := bs.One(id)

		component := view.PaymentList(
			u.Map(nb.Payments, func(p booking.Payment) *view.PaymentViewModel {
				return paymentViewModelFromBookingPayment(p)
			}),
		)

		if err := renderTempl(w, http.StatusOK, component); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	}
}

func handlePaymentForm(bs *booking.Service) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		id, err := strconv.Atoi(chi.URLParam(r, "id"))
		if err != nil {
			http.Error(w, "invalid payment id", http.StatusBadRequest)
			return
		}

		p := bs.OnePayment(id)
		form := view.PaymentForm(paymentViewModelFromBookingPayment(*p))
		if err := renderTempl(w, http.StatusOK, form); err != nil {
			http.Error(w, err.Error(), http.StatusInternalServerError)
		}
	}
}
