-- 0018_achievements.sql — 成就系统
CREATE TABLE IF NOT EXISTS achievements (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    code        VARCHAR(50)  NOT NULL,        -- 成就 code，如 'wash_streak_30'
    name        VARCHAR(100) NOT NULL,
    description VARCHAR(255) DEFAULT NULL,
    icon        VARCHAR(20)  DEFAULT NULL,    -- emoji
    threshold   INT          NOT NULL DEFAULT 1,  -- 触发条件
    created_at  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_ach_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS user_achievements (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    user_id         INT          NOT NULL,
    achievement_id  INT          NOT NULL,
    progress        INT          NOT NULL DEFAULT 0,
    unlocked_at     DATETIME     DEFAULT NULL,
    created_at      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_user_ach (user_id, achievement_id),
    INDEX idx_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO achievements (code, name, description, icon, threshold) VALUES
    ('wash_first',         '洗车新手',   '完成第一笔洗车记录',          '🧽', 1),
    ('wash_10',            '勤洗车友',   '累计洗车 10 次',             '🚿', 10),
    ('wash_50',            '洗车达人',   '累计洗车 50 次',             '🛁', 50),
    ('wash_100',           '洗车狂魔',   '累计洗车 100 次',            '🏆', 100),
    ('wash_streak_7',      '一周一洗',   '连续 7 天至少洗 1 次',       '📅', 7),
    ('wash_streak_30',     '月度好习惯', '连续 30 天至少洗 1 次',      '🌟', 30),
    ('refuel_10',          '小有车生活', '累计加油 10 次',             '⛽', 10),
    ('refuel_50',          '老司机',     '累计加油 50 次',             '🚗', 50),
    ('mileage_10000',      '万里征程',   '累计行驶突破 10000 公里',    '🛣️', 10000),
    ('mileage_100000',     '十万俱乐部', '累计行驶突破 100000 公里',   '🏅', 100000),
    ('maintain_first',     '爱车初保养', '完成第一笔保养记录',         '🔧', 1),
    ('maintain_5',         '按时保养',   '累计保养 5 次',              '⚙️', 5),
    ('cost_track_30d',     '记账坚持者', '连续 30 天有记录',           '📊', 30),
    ('insure_first',       '保险达人',   '记录第一张保单',             '🛡️', 1)
ON DUPLICATE KEY UPDATE name = VALUES(name), description = VALUES(description), icon = VALUES(icon), threshold = VALUES(threshold);
