package services

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

func AppList(req backend.AppListRequest) (result []appmodel.App, total int64, code int) {
	repo := data.NewAppRepo(paychannelmodel.GetInstance().GetDb())
	// 拼接查询条件
	conn := builder.NewCond()
	if req.MerchantId > 0 {
		conn = conn.And(builder.Eq{"merchant_id": req.MerchantId})
	}

	// 调用repo
	appList := make([]appmodel.App, 0)
	count, err := repo.AppList(conn, req.PageRequest, &appList)
	code = handErr(err)
	return appList, count, code
}

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

	_, err = repo.AppInsertOne(App)
	code = handErr(err)
	return
}

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

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

	code = handErr(err)
	return
}

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

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

	code = handErr(err)
	return
}