package share

import (
	"matchmaking-system/internal/biz/structure"
	"matchmaking-system/internal/pkg/flags"
	"matchmaking-system/internal/service/order"
	"strconv"

	v1 "matchmaking-system/api/matchmaking/v1/share"
	models "matchmaking-system/internal/pkg/model"
)

// ShareEurCancelReply
//
//	@Description:
//	@param check
//	@param err
//	@param req
//	@return *v1.EurOrderReply
func ShareEurCancelReply(check bool, err string, req *v1.CancelEurOrderRequest) *v1.EurOrderReply {
	code, replyStr := order.ResultCodeSrr(check, err)
	return &v1.EurOrderReply{
		Code:    code,
		Data:    ResultEurOrderMessage(req.OrderId),
		Message: replyStr,
	}
}

// VerificationEurShareCancel
//
//	@Description:
//	@param req
//	@return bool
func VerificationEurShareCancel(req *v1.CancelEurOrderRequest) bool {
	if len(req.GetOrderId()) <= 0 {
		return false
	}

	return true
}

// ShareAllEurPositionRequest
//
//	@Description:
//	@param check
//	@param err
//	@param req
//	@return *v1.AllEurOrderReply
func ShareAllEurPositionRequest(check bool, err string) *v1.AllEurOrderReply {
	code, replyStr := order.ResultCodeSrr(check, err)

	return &v1.AllEurOrderReply{
		Code:    code,
		Data:    "",
		Message: replyStr,
	}
}

// ShareEurPositionOrderReply
//
//	@Description:
//	@param check
//	@param err
//	@param req
//	@return *v1.EurOrderReply
func ShareEurPositionOrderReply(check bool, err string, req *v1.CancelEurOrderRequest) *v1.EurOrderReply {
	code, replyStr := order.ResultCodeSrr(check, err)

	return &v1.EurOrderReply{
		Code:    code,
		Data:    ResultEurOrderMessage(req.OrderId),
		Message: replyStr,
	}
}

// VerificationEurSharePosition
//
//	@Description:
//	@param req
//	@return bool
func VerificationEurSharePosition(req *v1.CancelEurOrderRequest) bool {
	if len(req.GetOrderId()) <= 0 {
		return false
	}

	return true
}

// StopEurOrderQuery
//
//	@Description:
//	@param request
//	@return structure.StopOrder
func StopEurOrderQuery(request *v1.UpdateEurOrderRequest) structure.StopOrder {
	return structure.StopOrder{
		OrderId:       request.OrderId,
		StopType:      request.StopType,
		StopLossPrice: request.StopLossPrice,
		StopWinPrice:  request.StopWinPrice,
	}
}

// ShareEurUpdateOrderReply
//
//	@Description:
//	@param check
//	@param err
//	@param req
//	@return *v1.SgdOrderReply
func ShareEurUpdateOrderReply(check bool, err string, req *v1.UpdateEurOrderRequest) *v1.EurOrderReply {
	code, replyStr := order.ResultCodeSrr(check, err)
	return &v1.EurOrderReply{
		Code:    code,
		Data:    ResultEurOrderMessage(req.OrderId),
		Message: replyStr,
	}
}

// VerificationEurStopOrderQuery
//
//	@Description:
//	@param request
//	@return bool
func VerificationEurStopOrderQuery(request *v1.UpdateEurOrderRequest) bool {
	if len(request.GetOrderId()) <= 0 {
		return false
	}
	switch request.StopType {
	case 1:
		if len(request.GetStopLossPrice()) <= 0 && len(request.GetStopWinPrice()) <= 0 {
			return false
		}
	case 0:
		return true
	default:
		return false
	}

	return true
}

// ShareEurOrderQuery
//
//	@Description:
//	@param request
//	@return structure.ShareOrder
func ShareEurOrderQuery(request *v1.ShareEurOrderRequest) structure.ShareOrder {
	return structure.ShareOrder{
		StockId:       request.StockId,
		TradeType:     request.TradeType,
		DealType:      request.DealType,
		LimitPrice:    request.LimitPrice,
		MarketPrice:   request.MarketPrice,
		MarketMoney:   request.MarketMoney,
		OrderNumber:   request.OrderNumber,
		ServiceCost:   request.ServiceCost,
		StopType:      request.StopType,
		StopLossPrice: request.StopLossPrice,
		StopWinPrice:  request.StopWinPrice,
		PryNum:        request.PryNum,
	}
}

// ResultEurOrderMessage
//
//	@Description:
//	@param orderId
//	@return *v1.SgdOrderResult
func ResultEurOrderMessage(orderId string) *v1.EurOrderResult {
	return &v1.EurOrderResult{
		OrderId: orderId,
	}
}

// ShareEurPlaceOrderReply
//
//	@Description:
//	@param check
//	@param err
//	@param orderId
//	@return *v1.SgdOrderReply
func ShareEurPlaceOrderReply(check bool, err string, orderId string) *v1.EurOrderReply {
	code, replyStr := order.ResultCodeSrr(check, err)

	return &v1.EurOrderReply{
		Code:    code,
		Data:    ResultEurOrderMessage(orderId),
		Message: replyStr,
	}
}

// VerificationSgdShareOrderQuery
//
//	@Description:
//	@param request
//	@return bool
func VerificationEurShareOrderQuery(request *v1.ShareEurOrderRequest) bool {
	if len(request.GetStockId()) <= 0 {
		return false
	}
	switch request.DealType {
	case 1:
		if len(request.GetLimitPrice()) <= 0 {
			return false
		}
	case 2:
		if len(request.GetMarketPrice()) <= 0 {
			return false
		}
	default:
		return false
	}
	if len(request.GetMarketMoney()) <= 0 {
		return false
	}
	if len(request.GetOrderNumber()) <= 0 {
		return false
	}
	if len(request.GetServiceCost()) <= 0 {
		return false
	}
	switch request.StopType {
	case 1:
		if len(request.GetStopLossPrice()) <= 0 && len(request.GetStopWinPrice()) <= 0 {
			return false
		}
	}
	switch request.TradeType {
	case 1:
	case 2:
	default:
		return false
	}

	return true
}

// VerificationEurBotStockTrade
//
//	@Description:
//	@param req
//	@return bool
func VerificationEurBotStockTrade(req *v1.GetEurBotStockTradeRequest) bool {
	if req.GetPageSize() < 0 {
		return false
	}
	if req.GetStatus() < 0 {
		return false
	}
	if req.GetPageCount() < 0 {
		return false
	}
	return true
}

// BotStockEurTradeReply
//
//	@Description:
//	@param check
//	@param err
//	@param req
//	@param data
//	@param totalCount
//	@return *v1.GetBotStockEurTradeReply
func BotStockEurTradeReply(check bool, err string, req *v1.GetEurBotStockTradeRequest, data []*models.BotStockEurTrade, totalCount int64) *v1.GetBotStockEurTradeReply {
	code, replyStr := order.ResultCodeSrr(check, err)
	return &v1.GetBotStockEurTradeReply{
		Code: code,
		Data: &v1.BotStockEurTradeReply{
			PageSize:   req.PageSize,
			PageCount:  req.PageCount,
			Data:       BotStockEurTradeMessage(data),
			TotalCount: totalCount,
		},
		Message: replyStr,
	}
}

// BotStockEurTradeMessage
//
//	@Description:
//	@param stockList
//	@return BotStockEurTrade
func BotStockEurTradeMessage(stockList []*models.BotStockEurTrade) (stockTrade []*v1.BotStockEurTrade) {
	for _, value := range stockList {
		stockTrade = append(stockTrade, &v1.BotStockEurTrade{
			OrderId:       value.OrderId,
			StockId:       value.StockId,
			TradeType:     int64(value.TradeType),
			DealType:      int64(value.DealType),
			LimitPrice:    value.LimitPrice,
			MarketPrice:   value.MarketPrice,
			DealPrice:     value.DealPrice,
			ClosingPrice:  value.ClosingPrice,
			OrderNumber:   value.OrderNumber,
			StopType:      int64(value.StopType),
			StopLossPrice: value.StopLossPrice,
			StopWinPrice:  value.StopWinPrice,
			ServiceCost:   value.ServiceCost,
			MarketMoney:   value.MarketMoney,
			OrderMoney:    value.OrderMoney,
			ClosingCost:   value.ClosingCost,
			Status:        int64(value.Status),
			CreateTime:    value.CreateTime.Format(flags.LayoutTime),
			UpdateTime:    value.UpdateTime.Format(flags.LayoutTime),
			OpenTime:      value.OpenTime.Format(flags.LayoutTime),
			ClosingTime:   value.ClosingTime.Format(flags.LayoutTime),
			KeepDecimal:   strconv.Itoa(value.KeepDecimal),
			StockName:     value.StockName,
			PryNum:        strconv.Itoa(value.PryNum),
		})
	}
	return
}