package lock

import (
	"context"
	"eta/eta_mini_ht_api/common/component/cache"
	"fmt"
	"github.com/go-redis/redis/v8"
)

const (
	lockName = "lock:"
)

var (
	ctx = context.Background()
	rdb = cache.GetInstance()
)

func AcquireLock(key string, expiration int, Holder string) bool {
	script := redis.NewScript(`local key = KEYS[1]
			local clientId = ARGV[1]
			local expiration = tonumber(ARGV[2])
			if redis.call("EXISTS", key) == 0 then
				redis.call("SET", key, clientId, "EX", expiration)
				return 1
			else
				return 0
			end`)

	lockey := fmt.Sprintf("%s%s", lockName, key)
	result, err := script.Run(ctx, rdb.RedisClient(), []string{lockey}, Holder, expiration).Int()
	if err != nil {
		return false
	}
	if result == 1 {
		return true
	}
	return false
}

func ReleaseLock(key string, holder string) bool {
	script := redis.NewScript(`
	   if redis.call("get", KEYS[1]) == ARGV[1] then
	       return redis.call("del", KEYS[1])
	   else
	       return 0
	   end
	`)
	lockey := fmt.Sprintf("%s%s", lockName, key)
	result, err := script.Run(ctx, rdb.RedisClient(), []string{lockey}, holder).Int()
	if err != nil {
		return false
	}
	if result == 1 {
		return true
	}
	return false
}