-- Migration: refund commission for existing pending (status=0) withdrawals
--
-- Under the old logic, commission was deducted when a withdrawal was submitted.
-- Under the new logic, commission is only deducted on approval.
-- This migration refunds the deducted amounts back to each user so that
-- the system is in a consistent state before the new code is deployed.
--
-- Idempotency: the UPDATE only touches rows whose commission would need
-- to increase, and each execution produces the same result because
-- COALESCE(SUM(amount),0) is deterministic given the same pending set.
-- Running this script multiple times is safe only if no new pending
-- withdrawals are created between runs; deploy new code immediately after.

-- Step 1: refund commission for all users with pending withdrawals.
UPDATE `user` u
JOIN (
    SELECT user_id, COALESCE(SUM(amount), 0) AS pending_total
    FROM withdrawals
    WHERE status = 0
    GROUP BY user_id
) p ON u.id = p.user_id
SET u.commission = u.commission + p.pending_total
WHERE p.pending_total > 0;

-- Step 2: write a migration log entry for each refunded user.
INSERT INTO system_log (type, date, object_id, content, created_at)
SELECT
    3 AS type,
    DATE(NOW()) AS date,
    p.user_id AS object_id,
    JSON_OBJECT(
        'type', 99,
        'amount', p.pending_total,
        'order_no', '',
        'timestamp', UNIX_TIMESTAMP(NOW()) * 1000,
        'note', 'migration: refund pending withdrawal commission (HIF-22)'
    ) AS content,
    NOW() AS created_at
FROM (
    SELECT user_id, COALESCE(SUM(amount), 0) AS pending_total
    FROM withdrawals
    WHERE status = 0
    GROUP BY user_id
    HAVING pending_total > 0
) p;
