package api

import (
	"encoding/json"
	"log"
	"net/http"
	"time"

	"gorm.io/gorm"
)

type Topup struct {
	gorm.Model    `json:"-"`
	TransactionID int    `json:"-" gorm:"column:transaction"`
	MemberNum     int    `json:"member" gorm:"column:member"`
	Member        Member `json:"-" gorm:"foreignKey:MemberNum;references:Num"`
	Comment       string `json:"comment"`
}

func (a *api) AddTopup(adminNum int, w http.ResponseWriter, req *http.Request) {
	var topup struct {
		Member  int    `json:"member"`
		Comment string `json:"comment"`
		Ammount int    `json:"ammount"`
	}
	err := json.NewDecoder(req.Body).Decode(&topup)
	if err != nil {
		log.Printf("Can't parse topup: %v", err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	httpStatus := a.updateMemberBalance(topup.Member, topup.Ammount)
	if httpStatus != http.StatusOK {
		w.WriteHeader(httpStatus)
		return
	}

	transaction := Transaction{
		MemberNum: topup.Member,
		Date:      time.Now(),
		Topup: Topup{
			MemberNum: adminNum,
			Comment:   topup.Comment,
		},
		Type:  "toupup",
		Total: topup.Ammount,
	}
	err = a.db.Create(&transaction).Error
	if err != nil {
		log.Printf("Can't create topup: %v\n%v", err, transaction)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusCreated)
	err = json.NewEncoder(w).Encode(transaction)
	if err != nil {
		log.Printf("Can't encode added topup: %v", err)
		w.WriteHeader(http.StatusInternalServerError)
	}

}