-- ============================================================
-- 抢购 Lua 脚本（原子完成：限购校验 + 库存扣减）
--
-- KEYS[1] = 库存 key           seckill:stock:{activityId}:{skuId}
-- KEYS[2] = 用户限购计数 key   seckill:user:{userId}:{activityId}:{skuId}
-- ARGV[1] = 限购数量 per_limit
-- ARGV[2] = 本次购买 quantity
-- ARGV[3] = key 过期时间（秒） —— 用于清理
--
-- 返回值：
--   {0, "OK"}         扣减成功
--   {-1, "BOUGHT"}    之前没买过但库存检查发现"已购"标记异常（理论上不会）
--   {-2, "LIMIT"}     超过每人限购
--   {-3, "EMPTY"}     库存为 0
-- ============================================================

-- 1. 限购校验：累计购买 + 本次 <= 限购
local bought = tonumber(redis.call('GET', KEYS[2]) or '0')
local perLimit = tonumber(ARGV[1])
local qty = tonumber(ARGV[2])
if bought + qty > perLimit then
    return {-2, 'LIMIT_EXCEEDED'}
end

-- 2. 库存校验
local stock = tonumber(redis.call('GET', KEYS[1]) or '0')
if stock < qty then
    return {-3, 'STOCK_EMPTY'}
end

-- 3. 原子扣库存 + 累计已购
local newStock = redis.call('DECRBY', KEYS[1], qty)
if newStock < 0 then
    -- 极端情况：刚好被另一个线程抢光，回滚
    redis.call('INCRBY', KEYS[1], qty)
    return {-3, 'STOCK_EMPTY'}
end
local newBought = redis.call('INCRBY', KEYS[2], qty)
local ttl = tonumber(ARGV[3])
redis.call('EXPIRE', KEYS[2], ttl)

return {0, 'OK', newStock, newBought}
