package services

import (
	"PaymentCenter/app/constants/errorcode"
	"PaymentCenter/app/data"
	"PaymentCenter/app/http/entities/backend"
	"PaymentCenter/app/models/orderrequestlogmodel"
	"PaymentCenter/app/models/ordersmodel"
	"PaymentCenter/app/models/orderthirdpaylogmodel"
	"PaymentCenter/app/models/paychannelmodel"
	"database/sql"
	"xorm.io/builder"
)

// 订单列表,后台查询
func OrderList(req backend.OrderList) (result []ordersmodel.OrdersBackendList, total int64, code int) {
	repo := data.NewOrderRepo(paychannelmodel.GetInstance().GetDb())
	// 拼接查询条件
	conn := builder.NewCond()
	if req.Id > 0 {
		conn = conn.And(builder.Eq{"orders.id": req.Id})
	}
	if req.MerchantId > 0 {
		conn = conn.And(builder.Eq{"orders.merchant_id": req.MerchantId})
	}
	if req.PayChannelId > 0 {
		conn = conn.And(builder.Eq{"orders.pay_channel_id": req.PayChannelId})
	}
	if req.AppId > 0 {
		conn = conn.And(builder.Eq{"orders.app_id": req.AppId})
	}
	if req.OutTreadNo != "" {
		conn = conn.And(builder.Like{"orders.out_tread_no", req.OutTreadNo})
	}
	if req.Status > 0 {
		conn = conn.And(builder.Eq{"orders.status": req.Status})
	}
	if req.OrderType > 0 {
		conn = conn.And(builder.Eq{"orders.order_type": req.OrderType})
	}
	if !req.StartTime.IsZero() {
		conn = conn.And(builder.Gte{"orders.create_time": req.StartTime})
	}
	if !req.EndTime.IsZero() {
		conn = conn.And(builder.Lte{"orders.create_time": req.EndTime})
	}

	// 调用repo
	orderList := make([]ordersmodel.OrdersBackendList, 0)
	count, err := repo.OrdersBackendList(conn, req.PageRequest, &orderList)
	code = handErr(err)
	return orderList, count, code
}

func OrderLogsList(req backend.OrderLogsListRequest) (requestLog []orderrequestlogmodel.OrderRequestLog, thirdLod []orderthirdpaylogmodel.OrderThirdPayLog, code int) {
	requestRepo := data.NewOrderRequestLogRepo(paychannelmodel.GetInstance().GetDb())
	thirdRepo := data.NewOrderThirdPayLogRepo(paychannelmodel.GetInstance().GetDb())

	conn := builder.NewCond()
	if req.OrderId > 0 {
		conn = conn.And(builder.Eq{"order_id": req.OrderId})
	}
	// 请求日志
	orderLogList := make([]orderrequestlogmodel.OrderRequestLog, 0)
	_, err := requestRepo.OrderRequestLogList(conn, req.PageRequest, &orderLogList)
	if err != nil {
		code = handErr(err)
		return
	}
	// 三方日志
	thirdLogList := make([]orderthirdpaylogmodel.OrderThirdPayLog, 0)
	_, err = thirdRepo.OrderThirdPayLogList(conn, req.PageRequest, &thirdLogList)
	code = handErr(err)

	return orderLogList, thirdLogList, code
}

func OrderCreate(orderIn *ordersmodel.Orders) (orderOut *ordersmodel.Orders, code int) {
	repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
	_, err := repo.OrderInsertOne(orderIn)
	code = handErr(err)
	return orderIn, code
}

func OrderUpdate(order *ordersmodel.Orders, col ...string) (code int) {
	repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
	// 拼接查询条件
	conn := builder.NewCond()
	conn = conn.And(builder.Eq{"Id": order.Id})
	_, err := repo.OrderUpdate(order, conn, col...)

	code = handErr(err)
	return
}

func OrderFindOne(order *ordersmodel.Orders, conn builder.Cond, col ...string) (merchantInfo *ordersmodel.Orders, code int) {
	repo := data.NewOrderRepo(ordersmodel.GetInstance().GetDb())
	// 拼接查询条件
	orderInfo, err := repo.OrderFindOne(order, conn, col...)
	if err != nil {
		if err == sql.ErrNoRows {
			return nil, errorcode.OrdersNotFound
		}
		return nil, errorcode.SystemError
	}
	return orderInfo, errorcode.Success
}

func PayOrderCheckRepeat(order *ordersmodel.Orders, conn builder.Cond) (exist bool, code int) {
	_, code = OrderFindOne(order, conn)
	if code != errorcode.OrdersNotFound {
		return false, errorcode.Success
	}
	return true, code
}