package controller

import (
	_const "chonho/const"
	"chonho/internal/api-v1/entity"
	"chonho/internal/api-v1/usecase/user_usecase"
	"chonho/pkg/model"
	"github.com/gin-gonic/gin"
)

type UserController struct {
	Controller
	userUseCase user_usecase.UseCase
}

func NewUserController(uc user_usecase.UseCase) *UserController {
	return &UserController{
		userUseCase: uc,
	}
}

// UpdateAddress godoc
// @Summary Update shipping address
// @Tags User
// @ID update-shipping-address
// @Accept json
// @Produce json
// @Param json body entity.UpdateShippingAddressRequest true "update info"
// @Success 200 {object} entity.UpdateShippingAddressResponse
// @Failure 400 {object} entity.Response
// @Router /user/address [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *UserController) UpdateAddress(ctx *gin.Context) {
	var req entity.UpdateShippingAddressRequest
	if valid := h.WrapBindAndValidate(ctx, &req); valid {
		user := h.GetLoggedUser(ctx)
		address, err := h.userUseCase.UpdateAddress(user.Id, req)
		h.WrapResponse(ctx, address, err)
	}
}

// ChangePassword godoc
// @Summary Change password
// @Description Change new password
// @Tags User
// @ID user-change-password
// @Accept json
// @Produce json
// @Param json body entity.ChangePasswordRequest true "phone/password"
// @Success 200 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /user/password [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
func (h *UserController) ChangePassword(ctx *gin.Context) {
	var request entity.ChangePasswordRequest
	if h.WrapBindAndValidate(ctx, &request) {
		loggedUserI, _ := ctx.Get("user")
		user, _ := loggedUserI.(*model.User)
		err := h.userUseCase.ChangePassword(user.Id, request.NewPassword, ctx)
		h.WrapResponse(ctx, nil, err)
	}
}

// SaveToken godoc
// @Summary Save Fcm Token
// @Description save registration token for notification
// @Tags User
// @ID user-add-token
// @Accept json
// @Produce json
// @Param json body entity.AddFCMTokenRequest true "fcm registration token "
// @Success 200 {object} entity.Response
// @Failure 400 {object} entity.Response
// @Router /user/fcm-registration-token [post]
// @Security BearerAuth
// @Security ApiVersion
// @Security AppVersion
// @Security AppPlatform
// @Security AppDeviceId
func (h *UserController) SaveToken(ctx *gin.Context) {
	var request entity.AddFCMTokenRequest
	if h.WrapBindAndValidate(ctx, &request) {
		loggedUserI, _ := ctx.Get("user")
		user, _ := loggedUserI.(*model.User)
		deviceId := ctx.GetHeader(_const.HeaderDeviceIdKey)
		err := h.userUseCase.AddFCMRegistrationToken(user.Id, request.RegistrationToken, deviceId)
		h.WrapResponse(ctx, nil, err)
	}
}
