-- =================================
-- 自由云商城 数据库结构 + 初始数据
-- 安装程序会自动把 __PREFIX__ 替换为用户填写的表前缀
-- 编码：utf8mb4 / InnoDB
-- =================================

-- 用户表（普通用户与后台管理员共用，is_admin=1 为管理员；status=0 表示被封禁）
CREATE TABLE `__PREFIX__users` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `username`   VARCHAR(50)  NOT NULL,
  `password`   VARCHAR(255) NOT NULL,
  `email`      VARCHAR(120) NOT NULL DEFAULT '',
  `is_admin`   TINYINT(1)  NOT NULL DEFAULT 0,
  `role`       VARCHAR(10) NOT NULL DEFAULT 'user' COMMENT 'admin管理员 cs客服 user普通用户（后台登录用 role IN admin/cs）',
  `avatar`     VARCHAR(255) DEFAULT '' COMMENT '头像文件路径',
  `status`     TINYINT(1)  NOT NULL DEFAULT 1 COMMENT '1正常 0已封禁',
  `nickname`   VARCHAR(60)  NOT NULL DEFAULT '' COMMENT '昵称',
  `verified`   TINYINT(1)  NOT NULL DEFAULT 0 COMMENT '邮箱是否验证 0未验证 1已验证',
  `email_token` VARCHAR(64)  NOT NULL DEFAULT '' COMMENT '邮箱验证令牌',
  `reg_ip`     VARCHAR(45)  NOT NULL DEFAULT '' COMMENT '注册 IP（限频用）',
  `points`      INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分余额',
  `invite_code` VARCHAR(12)  NOT NULL DEFAULT '' COMMENT '我的邀请码（唯一，用于邀请奖励）',
  `invited_by` INT UNSIGNED DEFAULT NULL COMMENT '邀请人 user_id（通过邀请注册时记录）',
  `created_at` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  UNIQUE KEY `uk_invite_code` (`invite_code`),
  KEY `idx_invited_by` (`invited_by`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 商品表
CREATE TABLE `__PREFIX__products` (
  `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`        VARCHAR(120) NOT NULL,
  `price`       DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `stock`       INT UNSIGNED NOT NULL DEFAULT 0,
  `category`    VARCHAR(40)  NOT NULL DEFAULT '其他',
  `icon`        VARCHAR(40)  NOT NULL DEFAULT 'fa-box',
  `image`       VARCHAR(255) DEFAULT '',
  `description` TEXT,
  `period_days` INT          NOT NULL DEFAULT 0 COMMENT '周期天数：0=一次性/实物，>0=按天计的周期商品（如 30/90/365）',
  `points_price` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分价：0=不可用积分购买，>0=可用该积分数购买',
  `status`      TINYINT(1)   NOT NULL DEFAULT 1 COMMENT '1上架 0下架',
  `created_at`  DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_category` (`category`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 商品分组（后台可增删，用于首页分类筛选与商品归类）
CREATE TABLE `__PREFIX__product_groups` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`       VARCHAR(40)  NOT NULL,
  `icon`       VARCHAR(40)  NOT NULL DEFAULT 'fa-tags',
  `sort_order` INT          NOT NULL DEFAULT 0,
  `created_at` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 订单表（status: pending待付款 paid已付款 shipped已发货 completed已完成 cancelled已取消）
CREATE TABLE `__PREFIX__orders` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `order_no`   VARCHAR(32)  NOT NULL,
  `user_id`    INT UNSIGNED NOT NULL,
  `total`      DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `status`     VARCHAR(20)   NOT NULL DEFAULT 'pending',
  `contact`    VARCHAR(60)   DEFAULT '',
  `contact_email` VARCHAR(120) DEFAULT '' COMMENT '联系邮箱（下单人填写）',
  `address`    VARCHAR(255)  DEFAULT '',
  `note`       VARCHAR(255)  DEFAULT '',
  `period_days` INT          NOT NULL DEFAULT 0 COMMENT '本单周期天数（取商品最大值）',
  `expires_at` DATETIME     DEFAULT NULL COMMENT '到期时间（周期商品有值）',
  `expire_notify_sent` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '到期前提醒邮件是否已发送 0未发 1已发',
  `pay_type`   VARCHAR(10)  NOT NULL DEFAULT 'cash' COMMENT 'cash现金 points积分支付',
  `points_used` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分支付时扣减的积分数',
  `created_at` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_order_no` (`order_no`),
  KEY `idx_user` (`user_id`),
  KEY `idx_expires` (`expires_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 订单明细表
CREATE TABLE `__PREFIX__order_items` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `order_id`   INT UNSIGNED NOT NULL,
  `product_id` INT UNSIGNED NOT NULL,
  `name`       VARCHAR(120) NOT NULL,
  `price`      DECIMAL(10,2) NOT NULL,
  `qty`        INT UNSIGNED NOT NULL,
  `subtotal`   DECIMAL(10,2) NOT NULL,
  `period_days` INT          NOT NULL DEFAULT 0 COMMENT '下单时商品的周期天数',
  PRIMARY KEY (`id`),
  KEY `idx_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 发货信息表（管理员发货时填写：连接信息/登录凭据）
CREATE TABLE `__PREFIX__order_deliveries` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `order_id`   INT UNSIGNED NOT NULL,
  `server_ip`  VARCHAR(60)   DEFAULT '' COMMENT '服务器 IP',
  `conn_addr`  VARCHAR(255)  DEFAULT '' COMMENT '连接地址/域名',
  `login_user` VARCHAR(120)  DEFAULT '' COMMENT '登录账户',
  `login_pass` VARCHAR(255)  DEFAULT '' COMMENT '登录密码',
  `remark`     TEXT,
  `activated`   TINYINT(1)   NOT NULL DEFAULT 0 COMMENT '激活状态：0未激活 1已激活（管理员填写，用户端展示）',
  `product_info` TEXT          COMMENT '商品信息（管理员填写后展示给用户）',
  `created_at` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_order` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 系统设置表（SMTP 等键值对）
CREATE TABLE `__PREFIX__settings` (
  `k` VARCHAR(64)  NOT NULL,
  `v` TEXT,
  PRIMARY KEY (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 工单部门表
CREATE TABLE `__PREFIX__ticket_departments` (
  `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name`        VARCHAR(60)  NOT NULL,
  `description` VARCHAR(255) DEFAULT '',
  `sort`        INT NOT NULL DEFAULT 0,
  `created_at`  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 工单表
CREATE TABLE `__PREFIX__tickets` (
  `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id`     INT UNSIGNED NOT NULL,
  `dept_id`     INT UNSIGNED NOT NULL DEFAULT 0,
  `order_id`    INT UNSIGNED DEFAULT NULL COMMENT '关联订单（续期工单用）',
  `type`        VARCHAR(20) NOT NULL DEFAULT 'general' COMMENT 'general普通 renewal续期申请',
  `subject`     VARCHAR(160) NOT NULL,
  `message`     TEXT NOT NULL,
  `status`      VARCHAR(20) NOT NULL DEFAULT 'open' COMMENT 'open待处理 pending处理中 resolved已解决 closed已关闭',
  `priority`    TINYINT(1)   NOT NULL DEFAULT 2 COMMENT '1低 2普通 3高',
  `admin_reply` TEXT,
  `admin_id`    INT UNSIGNED DEFAULT NULL,
  `assignee_id` INT UNSIGNED DEFAULT NULL COMMENT '负责人（客服/管理员）用户ID，NULL=未分配（仅管理员可见）',
  `created_at`  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `closed_at`   DATETIME DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`),
  KEY `idx_user` (`user_id`),
  KEY `idx_dept` (`dept_id`),
  KEY `idx_order` (`order_id`),
  KEY `idx_assignee` (`assignee_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 工单回复表（多轮对话，is_admin=1 表示客服/管理员回复）
CREATE TABLE `__PREFIX__ticket_replies` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `ticket_id`  INT UNSIGNED NOT NULL,
  `user_id`    INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复人 user_id（管理员/客服回复时填其 id，用户回复时填下单用户 id）',
  `is_admin`   TINYINT(1)   NOT NULL DEFAULT 0 COMMENT '1=管理员/客服回复 0=用户回复',
  `message`    TEXT NOT NULL,
  `created_at` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_ticket` (`ticket_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 公告中心
CREATE TABLE `__PREFIX__announcements` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `title`      VARCHAR(160) NOT NULL,
  `content`    TEXT NOT NULL,
  `pinned`     TINYINT(1)   NOT NULL DEFAULT 0 COMMENT '1置顶',
  `status`     TINYINT(1)   NOT NULL DEFAULT 1 COMMENT '1显示 0隐藏',
  `created_at` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`),
  KEY `idx_pinned` (`pinned`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 积分流水表（签到 / 邀请 / 消费 / 后台调整 等记录）
CREATE TABLE `__PREFIX__points_log` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id`    INT UNSIGNED NOT NULL,
  `type`       VARCHAR(20)  NOT NULL DEFAULT 'sign' COMMENT 'sign签到 invite邀请 purchase消费 admin后台调整 refund退还',
  `amount`     INT          NOT NULL DEFAULT 0 COMMENT '变动量：正=增加 负=扣减',
  `balance`    INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '变动后余额',
  `remark`     VARCHAR(255) DEFAULT '',
  `created_at` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 每日签到记录（每人每天一条，防止重复签到）
CREATE TABLE `__PREFIX__sign_logs` (
  `id`         INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id`    INT UNSIGNED NOT NULL,
  `sign_date`  DATE         NOT NULL,
  `points`     INT UNSIGNED NOT NULL DEFAULT 0,
  `created_at` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_date` (`user_id`, `sign_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 初始示例商品（分类：周边 / 数码 / 虚拟 / 图书）
-- ============================================================
INSERT INTO `__PREFIX__products` (`name`, `price`, `stock`, `category`, `icon`, `image`, `description`) VALUES
('自由云定制帆布包',   39.00, 100,  '周边', 'fa-shopping-bag', '', '印有自由云科技团队 Logo 的环保帆布包，简约实用，容量充足。'),
('自由云贴纸套装',    9.90,  500,  '周边', 'fa-sticky-note',  '', '多种尺寸防水贴纸，装点你的电脑、水杯与笔记本。'),
('机械键盘 87 键',   199.00, 50,   '数码', 'fa-keyboard',     '', '热插拔轴体，RGB 背光，打字手感顺滑，附赠拔轴器。'),
('10000mAh 移动电源', 79.00, 80,   '数码', 'fa-battery-full', '', '轻薄便携，支持双向快充，可为手机平板多次续电。'),
('MC 服务器 VIP 月卡', 12.00, 9999, '虚拟', 'fa-cube',         '', '自由 MC 服务器专属 VIP 月卡，享优先进入与专属昵称色。'),
('图床扩容包 10GB',   5.00,  9999, '虚拟', 'fa-images',       '', '为你的公益图床账号扩容 10GB 存储空间。'),
('《从零学 PHP》实体书', 49.00, 30,   '图书', 'fa-book',         '', '面向中学生的 PHP 入门教程，案例丰富、通俗易懂。'),
('《网络安全小百科》', 35.00, 40,   '图书', 'fa-shield-alt',   '', '图文并茂的网络安全科普读物，适合青少年阅读。');

-- =======================
-- 初始商品分组（与上面商品 category 对应：周边 / 数码 / 虚拟 / 图书）
-- =======================
INSERT INTO `__PREFIX__product_groups` (`name`, `icon`, `sort_order`) VALUES
('周边', 'fa-shopping-bag', 1),
('数码', 'fa-microchip',    2),
('虚拟', 'fa-cube',         3),
('图书', 'fa-book',         4);

-- =====================
-- 初始工单部门
-- =====================
INSERT INTO `__PREFIX__ticket_departments` (`name`, `description`, `sort`) VALUES
('技术支持', '产品使用、功能咨询', 1),
('售后服务', '退换货、订单与物流问题', 2),
('财务与支付', '发票、支付异常', 3),
('其他',     '其他无法归类的问题', 9);

-- =======================
-- 初始系统设置（SMTP 留空，安装后在后台「设置」中填写）
-- =======================
INSERT INTO `__PREFIX__settings` (`k`, `v`) VALUES
('smtp_host',     ''),
('smtp_port',     ''),
('smtp_enc',      ''),
('smtp_user',     ''),
('smtp_pass',     ''),
('smtp_from',     ''),
('smtp_fromname', '自由云商城'),
('notify_emails', ''),
('mall_about',    '自由云商城是自由云科技团队旗下的公益电商，坚持「公益 · 实惠 · 用心挑选」的理念，为社区提供周边、数码、虚拟服务与图书等好物。所有收益用于支持团队的公益技术服务。'),
('points_enabled', '1'),
('points_sign',    '5'),
('points_invite',  '20');

-- 支付日志表（记录支付宝/微信支付流水）
CREATE TABLE `__PREFIX__pay_logs` (
  `id`          INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `order_id`    VARCHAR(64)  NOT NULL COMMENT '商户订单号',
  `pay_method`  VARCHAR(20)  NOT NULL DEFAULT 'alipay' COMMENT 'alipay / wechat',
  `amount`      DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '支付金额',
  `trade_no`    VARCHAR(64)  DEFAULT '' COMMENT '第三方交易号',
  `status`      ENUM('pending','paid','failed','refunded') NOT NULL DEFAULT 'pending',
  `raw_response TEXT         DEFAULT NULL COMMENT '原始回调数据（调试用）',
  `created_at`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_order_method` (`order_id`, `pay_method`),
  KEY `idx_status` (`status`),
  KEY `idx_trade_no` (`trade_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 支付配置初始值
INSERT INTO `__PREFIX__settings` (`k`, `v`) VALUES
('pay_alipay_enabled',    '0'),
('pay_alipay_appid',     ''),
('pay_alipay_private_key',''),
('pay_alipay_public_key', ''),
('pay_alipay_sandbox',   '0'),
('pay_wechat_enabled',   '0'),
('pay_wechat_mch_id',    ''),
('pay_wechat_api_key',   ''),
('pay_wechat_appid',     '');
