package merchant

import (
	"context"
	"encoding/json"
	"fmt"
	"time"

	"github.com/beego/beego/v2/client/orm"
	"github.com/beego/beego/v2/core/logs"
)

type MerchantDeployInfo struct {
	Id                     int
	Status                 string
	MerchantUid            string
	PayType                string
	SingleRoadUid          string
	SingleRoadName         string
	SingleRoadPlatformRate string
	SingleRoadAgentRate    float64
	RollRoadCode           string
	RollRoadName           string
	RollRoadPlatformRate   float64
	RollRoadAgentRate      float64
	IsLoan                 string
	LoanRate               float64
	LoanDays               int
	UnfreezeHour           int
	WaitUnfreezeAmount     float64
	LoanAmount             float64
	UpdateTime             time.Time
	CreateTime             time.Time
}

type ProfitMargin struct {
	Label  string `json:"label"`
	LinkID string `json:"linkID"`
	Value  int    `json:"value"`
}

const MERCHANT_DEPLOY_INFO = "merchant_deploy_info"

func (m *MerchantDeployInfo) GetSingleRoadPlatformRateMapping(ctx context.Context) (map[int]float64, error) {
	myMap := make(map[int]float64)

	// 使用json.Unmarshal函数解码JSON字符串到map中
	err := json.Unmarshal([]byte(m.SingleRoadPlatformRate), &myMap)
	if err != nil {
		fmt.Println("Error decoding JSON:", err)
		return myMap, err
	}
	return myMap, err
}

func (m *MerchantDeployInfo) GetSingleRoadPlatformRateByPrice(ctx context.Context, price int) (float64, error) {
	mapping, err := m.GetSingleRoadPlatformRateMapping(ctx)

	if err != nil {
		return 0.0, err
	}

	for k, v := range mapping {
		if k == price {
			return v, nil
		}
	}
	return 0.0, nil
}

func CheckNumberMappingValid(str string) bool {
	myMap := make(map[int]float64)

	// 使用json.Unmarshal函数解码JSON字符串到map中
	err := json.Unmarshal([]byte(str), &myMap)

	if err != nil {
		fmt.Println("Error decoding JSON:", str, err)
		return false
	}
	return true
}

func CheckMarginValid(str string) bool {
	var m []ProfitMargin
	err := json.Unmarshal([]byte(str), &m)
	if err != nil {
		fmt.Println("Error decoding JSON:", err, str)
		return false
	}
	return true
}

func InsertMerchantDeployInfo(ctx context.Context, merchantDeployInfo MerchantDeployInfo) bool {
	o := orm.NewOrm()
	_, err := o.InsertWithCtx(ctx, &merchantDeployInfo)
	if err != nil {
		logs.Error("insert merchant deploy info fail: ", err)
		return false
	}
	return true
}

func IsExistByUidAndPayType(ctx context.Context, uid, payType string) bool {
	o := orm.NewOrm()
	isEixst := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).Filter("pay_type", payType).ExistWithCtx(ctx)
	return isEixst
}

func GetMerchantDeployByUidAndPayType(ctx context.Context, uid, payType string) MerchantDeployInfo {
	o := orm.NewOrm()
	var merchantDeployInfo MerchantDeployInfo
	_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).
		Filter("pay_type", payType).Limit(1).
		AllWithCtx(ctx, &merchantDeployInfo)
	if err != nil {
		logs.Error("get merchant deploy by uid and paytype fail:", err)
	}
	return merchantDeployInfo
}

func DeleteMerchantDeployByUidAndPayType(ctx context.Context, uid, payType string) bool {
	o := orm.NewOrm()
	_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).Filter("pay_type", payType).DeleteWithCtx(ctx)
	if err != nil {
		logs.Error("delete merchant deploy by uid and payType fail: ", err)
		return false
	}
	return true
}

func DeleteOtherMerchantDeployInfo(ctx context.Context, deployInfo MerchantDeployInfo) {
	o := orm.NewOrm()
	_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", deployInfo.MerchantUid).
		Filter("id__ne", deployInfo.Id).DeleteWithCtx(ctx)
	if err != nil {
		logs.Error("delete other merchant deploy by uid and payType fail: ", err)
	}
}

func UpdateMerchantDeploy(ctx context.Context, merchantDeploy MerchantDeployInfo) bool {
	o := orm.NewOrm()
	_, err := o.UpdateWithCtx(ctx, &merchantDeploy)
	if err != nil {
		logs.Error("update merchant deploy fail: ", err)
		return false
	}
	return true
}
