package notification_usecase

import (
	"chonho/internal/api-v1/repository/fmc_repository"
	"chonho/internal/api-v1/repository/order_repository"
	"chonho/internal/api-v1/repository/store_repository"
	"chonho/internal/api-v1/repository/user_repository"
	fcm "chonho/pkg/fcm"
	"fmt"
)

const (
	CancelFromBuyer  = 1
	CancelFromSeller = 2
)

type NotificationUseCase interface {
	NotifyNewOrder(orderId int64)
	NotifyCancelOrder(orderId int64, cancelSide int)
	NotifyProvePayment(orderId int64)
	NotifyConfirmOrder(orderId int64)
	NotifyRemindRating(orderId int64)
}

type useCase struct {
	fcm       *fcm.FCM
	orderRepo order_repository.OrderRepository
	userRepo  user_repository.UserRepository
	storeRepo store_repository.StoreRepository
	fcmRepo   fmc_repository.FCMRepository
}

func (u useCase) NotifyNewOrder(orderId int64) {
	order, _ := u.orderRepo.FirstOrders(order_repository.OrderFilter{Id: orderId})
	if order != nil {
		store, _ := u.storeRepo.FirstStore(store_repository.StoreFilter{
			StoreId: order.StoreId,
		})
		if store != nil {
			// find seller token
			tokens, _ := u.fcmRepo.ListUserTokens(store.UserId)
			if len(tokens) > 0 {
				buyer, _ := u.userRepo.First(user_repository.UserFilter{
					UserID: order.UserId,
				})
				if buyer != nil {
					u.fcm.SendNotify(tokens, fcm.Message{
						Title:   "Bạn có đơn hàng mới",
						Message: fmt.Sprintf("%v vừa đặt hàng trên cửa hàng của bạn", buyer.Name),
					}, fmt.Sprintf("chonho://chonho.app/sellerOrderDetail/%v", orderId))
				}
			}
		}
	}
}

func (u useCase) NotifyCancelOrder(orderId int64, cancelSide int) {
	order, _ := u.orderRepo.FirstOrders(order_repository.OrderFilter{Id: orderId})
	if order != nil {
		store, _ := u.storeRepo.FirstStore(store_repository.StoreFilter{
			StoreId: order.StoreId,
		})
		if store != nil {
			switch cancelSide {
			case CancelFromBuyer:
				// find seller token
				tokens, _ := u.fcmRepo.ListUserTokens(store.UserId)
				if len(tokens) > 0 {
					buyer, _ := u.userRepo.First(user_repository.UserFilter{
						UserID: order.UserId,
					})
					if buyer != nil {
						u.fcm.SendNotify(tokens, fcm.Message{
							Title:   "Đơn hàng bị huỷ",
							Message: fmt.Sprintf("%v đã huỷ đơn hàng #%v", buyer.Name, order.Code),
						}, fmt.Sprintf("chonho://chonho.app/sellerOrderDetail/%v", orderId))
					}
				}
			case CancelFromSeller:
				tokens, _ := u.fcmRepo.ListUserTokens(order.UserId)
				if len(tokens) > 0 {
					u.fcm.SendNotify(tokens, fcm.Message{
						Title:   "Đơn hàng bị huỷ",
						Message: fmt.Sprintf("%v đã huỷ đơn hàng #%v của bạn", store.Name, order.Code),
					}, fmt.Sprintf("chonho://chonho.app/orderDetail/%v", orderId))
				}
			}

		}
	}
}

func (u useCase) NotifyProvePayment(orderId int64) {
	order, _ := u.orderRepo.FirstOrders(order_repository.OrderFilter{Id: orderId})
	if order != nil {
		store, _ := u.storeRepo.FirstStore(store_repository.StoreFilter{
			StoreId: order.StoreId,
		})
		if store != nil {
			// find seller token
			tokens, _ := u.fcmRepo.ListUserTokens(store.UserId)
			if len(tokens) > 0 {
				buyer, _ := u.userRepo.First(user_repository.UserFilter{
					UserID: order.UserId,
				})
				if buyer != nil {
					u.fcm.SendNotify(tokens, fcm.Message{
						Title:   "Xác nhận thanh toán",
						Message: fmt.Sprintf("%v đã gửi bằng chứng thanh toán cho đơn hàng #%v", buyer.Name, order.Code),
					}, fmt.Sprintf("chonho://chonho.app/sellerOrderDetail/%v", orderId))
				}
			}
		}
	}
}

func (u useCase) NotifyConfirmOrder(orderId int64) {
	order, _ := u.orderRepo.FirstOrders(order_repository.OrderFilter{Id: orderId})
	if order != nil {
		store, _ := u.storeRepo.FirstStore(store_repository.StoreFilter{
			StoreId: order.StoreId,
		})
		if store != nil {
			// find seller token
			tokens, _ := u.fcmRepo.ListUserTokens(order.UserId)
			if len(tokens) > 0 {
				u.fcm.SendNotify(tokens, fcm.Message{
					Title:   "Xác nhận đơn hàng",
					Message: fmt.Sprintf("%v đã xác nhận đơn hàng #%v của bạn", store.Name, order.Code),
				}, fmt.Sprintf("chonho://chonho.app/orderDetail/%v", orderId))
			}
		}
	}
}

func (u useCase) NotifyRemindRating(orderId int64) {
	order, _ := u.orderRepo.FirstOrders(order_repository.OrderFilter{Id: orderId})
	if order != nil {
		store, _ := u.storeRepo.FirstStore(store_repository.StoreFilter{
			StoreId: order.StoreId,
		})
		if store != nil {
			// find seller token
			tokens, _ := u.fcmRepo.ListUserTokens(order.UserId)
			if len(tokens) > 0 {
				u.fcm.SendNotify(tokens, fcm.Message{
					Title:   "Đánh giá đơn hàng",
					Message: fmt.Sprintf("Trải nghiệm đặt món tại %v thế nào. Hãy cho chúng mình biết để phục vụ các bạn tốt hơn nhé", store.Name),
				}, fmt.Sprintf("chonho://chonho.app/orderDetail/%v", orderId))
			}
		}
	}
}

func NewNotifyUsCase(orderRepo order_repository.OrderRepository, userRepo user_repository.UserRepository, storeRepo store_repository.StoreRepository, fcmRepo fmc_repository.FCMRepository) *useCase {
	return &useCase{
		fcm:       fcm.GetInstance(),
		orderRepo: orderRepo,
		userRepo:  userRepo,
		storeRepo: storeRepo,
		fcmRepo:   fcmRepo,
	}
}
