package dapi

import (
	"epur-pay/cache"
	"epur-pay/model"
	"epur-pay/pkg/async"
	"epur-pay/pkg/logger"
	"epur-pay/pkg/rds"
	"epur-pay/pkg/utils"
	"gorm.io/gorm"
)

func (a *ApiBase) apiAfter() error {

	if a.AfterCallback != nil {
		async.Asyncs.AfterCallback.Add(async.NewAsyncRequestFunc(a.AfterCallback, a.AfterCallbackDelay))
	}

	if Cf.ApiAfter != nil {
		if err := Cf.ApiAfter(a); err != nil {
			return err
		}
	}

	return nil
}

func (a *ApiBase) apiBefore() error {

	if err := a.limitRouterRuleHandler(); err != nil {
		return err
	}

	if err := a.headerHandler(); err != nil {
		return err
	}

	if Cf.ApiBefore != nil {
		if err := Cf.ApiBefore(a); err != nil {
			return err
		}
	}

	if !cache.Global.ProjectInitStatus {
		return a.ReturnPublicErrorResponse(a.Translate("during_upgrade"))
	}
	return nil
}

func (a *ApiBase) apiRunEx() error {

	if err := a.authHandler(); err != nil {
		return err
	}
	if err := a.lockTrade(); err != nil {
		return err
	}

	a.saveLogBefore()

	if err := a.apiHandler(); err != nil {
		return err
	}

	return nil
}

func (a *ApiBase) saveLogBefore() {
	//记录日志
	if a.InParams.IsSaveLog || a.InParams.IsSkipErrorSaveLog {
		a.Log = new(model.Log)

		a.Log.Event = a.InParams.SaveEvent
		if a.User != nil {
			a.Log.Uid = a.User.Uid
			a.Log.Name = a.User.Account
		}
		a.Log.Ip = a.ClientIp()
		a.Log.CreateTime = utils.Time2StampSecond()
		if a.Site == "h5App" {
			a.Log.UserType = "0"
		} else if a.Site == "h5Admin" {
			a.Log.UserType = "1"
		}
		a.Log.IsSuper = "0"
	}
}

func (a *ApiBase) apiRun() error {

	if a.InParams.IsTransaction {
		if err := rds.DB.Transaction(func(ts *gorm.DB) error {
			a.Ts = ts
			if err := a.apiRunEx(); err != nil && a.Error == nil {
				a.Error = err
			}
			if a.Error != nil {
				return a.Error
			} else {
				return nil
			}
		}); err != nil {
			logger.AccessLogger.Errorln(err.Error())
		}
	} else {
		a.Ts = rds.DB
		if err := a.apiRunEx(); err != nil && a.Error == nil {
			a.Error = err
		}
	}
	return a.Error
}

func (a *ApiBase) apiMain() error {

	if err := a.apiBefore(); err != nil {
		return err
	}
	if err := a.apiRun(); err != nil {
		return err
	}

	a.freeTrade()

	if err := a.apiAfter(); err != nil {
		return err
	}
	return nil
}

func (a *ApiBase) TMapGet(data model.JSON) string {
	if row, ok := data[a.Lang]; ok {
		return row.(string)
	} else {
		if row1, ok1 := data[cache.Global.Caches.Language.DefaultLanguage]; ok1 {
			return row1.(string)
		} else {
			return ""
		}
	}
}