package backend

import (
	"PaymentCenter/app/constants/errorcode"
	"PaymentCenter/app/http/controllers"
	"PaymentCenter/app/http/entities"
	"PaymentCenter/app/http/entities/backend"
	"PaymentCenter/app/models/appmodel"
	"PaymentCenter/app/services"
	"PaymentCenter/app/utils/encrypt/sm2"
	"github.com/ahmetb/go-linq/v3"
	"github.com/gin-gonic/gin"
)

func AppList(c *gin.Context) {
	req, _ := controllers.GetRequest(c).(*backend.AppListRequest)
	req.SetDefault()
	payChannelList, total, code := services.AppList(*req)

	result := make([]backend.AppResponse, 0, len(payChannelList))
	linq.From(payChannelList).SelectT(func(in appmodel.App) (out backend.AppResponse) {
		out.ResponseFromDb(in)
		return
	}).ToSlice(&result)
	data := entities.PageRsp{
		Total: total,
		Data:  result,
	}
	controllers.HandCodeRes(c, data, code)
}

func AppCreate(c *gin.Context) {
	req, _ := controllers.GetRequest(c).(*backend.AppCreateRequest)
	payChannel := req.RequestToDb()
	code := services.AppCreate(&payChannel)

	data := backend.AppResponse{}
	data.ResponseFromDb(payChannel)
	controllers.HandCodeRes(c, data, code)
}

func AppUpdate(c *gin.Context) {
	req, _ := controllers.GetRequest(c).(*backend.AppUpdateRequest)
	payChannel := req.RequestToDb()
	code := services.AppUpdate(&payChannel)

	data := backend.AppResponse{}
	data.ResponseFromDb(payChannel)
	controllers.HandCodeRes(c, data, code)
}

func AppDelete(c *gin.Context) {
	req, _ := controllers.GetRequest(c).(*entities.IdRequest)
	code := services.AppDelete(*req)
	controllers.HandCodeRes(c, nil, code)
}

func GenerateDecrypt(c *gin.Context) {
	req, _ := controllers.GetRequest(c).(*backend.GenerateDecryptKeyRequest)
	var publicKey, privateKey string
	var err error
	switch req.KeyType {
	default:
		publicKey, privateKey, err = sm2.GenerateSM2Key()
		if err != nil {
			controllers.Error(c, errorcode.SystemError, err.Error())
			return
		}
	}

	controllers.HandCodeRes(c, map[string]string{
		"publicKey":  publicKey,
		"privateKey": privateKey,
	}, errorcode.Success)
}