package services

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

func PayChannelList(req backend.PayChannelListRequest) (result []paychannelmodel.PayChannel, total int64, code int) {
	repo := data.NewPayChannelRepo(paychannelmodel.GetInstance().GetDb())
	// 拼接查询条件
	conn := builder.NewCond()
	if req.MerchantId > 0 {
		conn = conn.And(builder.Eq{"merchant_id": req.MerchantId})
	}
	if req.Id > 0 {
		conn = conn.And(builder.Eq{"id": req.Id})
	}

	// 调用repo
	paychannelList := make([]paychannelmodel.PayChannel, 0)
	count, err := repo.PayChannelList(conn, req.PageRequest, &paychannelList)
	code = handErr(err)
	return paychannelList, count, code
}

func PayChannelCreate(payChannel *paychannelmodel.PayChannel) (code int) {
	db := paychannelmodel.GetInstance().GetDb()
	repo := data.NewPayChannelRepo(db)
	merchantRepo := data.NewMerchantRepo(db)
	// 拼接查询条件
	conn := builder.NewCond()
	conn = conn.And(builder.Eq{"id": payChannel.MerchantId})
	merchant := merchantmodel.Merchant{}
	has, err := merchantRepo.MerchantDetail(&merchant, conn)
	if err != nil {
		return handErr(err)
	}
	if !has {
		return errorcode.MerchantNotFound
	}

	_, err = repo.PayChannelInsertOne(payChannel)
	code = handErr(err)
	return
}

func PayChannelUpdate(payChannel *paychannelmodel.PayChannel) (code int) {
	db := paychannelmodel.GetInstance().GetDb()
	repo := data.NewPayChannelRepo(db)

	// 拼接查询条件
	uconn := builder.NewCond()
	uconn = uconn.And(builder.Eq{"Id": payChannel.Id})
	_, err := repo.PayChannelUpdate(payChannel, uconn, "white_ip")

	code = handErr(err)
	return
}

func PayChannelDelete(req entities.IdRequest) (code int) {
	repo := data.NewPayChannelRepo(paychannelmodel.GetInstance().GetDb())

	// 拼接查询条件
	conn := builder.NewCond()
	conn = conn.And(builder.Eq{"Id": req.Id})
	m := paychannelmodel.PayChannel{Id: req.Id}
	_, err := repo.PayChannelDelete(&m, conn)

	code = handErr(err)
	return
}

func PayChannelGet(payChannel *paychannelmodel.PayChannel) (code int) {
	repo := data.NewPayChannelRepo(paychannelmodel.GetInstance().GetDb())

	// 拼接查询条件
	conn := builder.NewCond()
	conn = conn.And(builder.Eq{"id": payChannel.Id})
	has, err := repo.PayChannelGet(payChannel, conn)
	if err != nil {
		return handErr(err)
	}
	if !has {
		return errorcode.PayChannelNotFound
	}

	code = errorcode.Success
	return
}

func PayChannelFindOne(channel *paychannelmodel.PayChannel, conn builder.Cond, col ...string) (merchantInfo *paychannelmodel.PayChannel, code int) {
	repo := data.NewPayChannelRepo(paychannelmodel.GetInstance().GetDb())
	// 拼接查询条件
	channelInfo, err := repo.PayChannelFindOne(channel, conn, col...)
	if err != nil {
		if err == sql.ErrNoRows {
			return nil, errorcode.MerchantNotFound
		}
		return nil, errorcode.SystemError
	}
	return channelInfo, errorcode.Success
}

func GetAndCheckPayChannel(channel *paychannelmodel.PayChannel, conn builder.Cond, col ...string) (channelInfo *paychannelmodel.PayChannel, code int) {
	channelInfo, code = PayChannelFindOne(channel, conn, col...)
	if code != errorcode.Success {
		return nil, code
	}
	if !channelInfo.DeleteTime.IsZero() {
		return nil, errorcode.PayChannelNotFound
	}
	return
}