-- FendxPHP 数据库初始化脚本
-- 创建数据库和基础表结构

-- 创建数据库
CREATE DATABASE IF NOT EXISTS `fendx_php` 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

USE `fendx_php`;

-- 创建用户表
CREATE TABLE IF NOT EXISTS `users` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    `username` varchar(50) NOT NULL COMMENT '用户名',
    `email` varchar(100) NOT NULL COMMENT '邮箱',
    `password` varchar(255) NOT NULL COMMENT '密码',
    `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
    `avatar` varchar(255) DEFAULT NULL COMMENT '头像',
    `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
    `gender` enum('male','female','other') DEFAULT NULL COMMENT '性别',
    `birthday` date DEFAULT NULL COMMENT '生日',
    `bio` text COMMENT '个人简介',
    `status` varchar(20) DEFAULT 'active' COMMENT '状态: active, inactive, banned',
    `email_verified` tinyint(1) DEFAULT 0 COMMENT '邮箱是否验证',
    `phone_verified` tinyint(1) DEFAULT 0 COMMENT '手机是否验证',
    `email_verified_at` timestamp NULL DEFAULT NULL COMMENT '邮箱验证时间',
    `phone_verified_at` timestamp NULL DEFAULT NULL COMMENT '手机验证时间',
    `last_login_at` timestamp NULL DEFAULT NULL COMMENT '最后登录时间',
    `last_login_ip` varchar(45) DEFAULT NULL COMMENT '最后登录IP',
    `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `users_username_unique` (`username`),
    UNIQUE KEY `users_email_unique` (`email`),
    KEY `users_username_index` (`username`),
    KEY `users_email_index` (`email`),
    KEY `users_status_index` (`status`),
    KEY `users_created_at_index` (`created_at`),
    KEY `users_last_login_at_index` (`last_login_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';

-- 创建角色表
CREATE TABLE IF NOT EXISTS `roles` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID',
    `name` varchar(50) NOT NULL COMMENT '角色名称',
    `display_name` varchar(100) NOT NULL COMMENT '显示名称',
    `description` text COMMENT '角色描述',
    `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称',
    `is_active` tinyint(1) DEFAULT 1 COMMENT '是否激活',
    `sort_order` int(11) DEFAULT 0 COMMENT '排序',
    `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `roles_name_unique` (`name`),
    KEY `roles_name_index` (`name`),
    KEY `roles_guard_name_index` (`guard_name`),
    KEY `roles_is_active_index` (`is_active`),
    KEY `roles_sort_order_index` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';

-- 创建权限表
CREATE TABLE IF NOT EXISTS `permissions` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
    `name` varchar(100) NOT NULL COMMENT '权限名称',
    `display_name` varchar(100) NOT NULL COMMENT '显示名称',
    `description` text COMMENT '权限描述',
    `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称',
    `group_name` varchar(50) DEFAULT NULL COMMENT '权限分组',
    `is_active` tinyint(1) DEFAULT 1 COMMENT '是否激活',
    `sort_order` int(11) DEFAULT 0 COMMENT '排序',
    `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `permissions_name_unique` (`name`),
    KEY `permissions_name_index` (`name`),
    KEY `permissions_guard_name_index` (`guard_name`),
    KEY `permissions_group_name_index` (`group_name`),
    KEY `permissions_is_active_index` (`is_active`),
    KEY `permissions_sort_order_index` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';

-- 创建用户角色关联表
CREATE TABLE IF NOT EXISTS `user_roles` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
    `role_id` bigint(20) unsigned NOT NULL COMMENT '角色ID',
    `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称',
    `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `user_roles_unique` (`user_id`,`role_id`,`guard_name`),
    KEY `user_roles_user_id_index` (`user_id`),
    KEY `user_roles_role_id_index` (`role_id`),
    KEY `user_roles_guard_name_index` (`guard_name`),
    CONSTRAINT `user_roles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
    CONSTRAINT `user_roles_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';

-- 创建角色权限关联表
CREATE TABLE IF NOT EXISTS `role_permissions` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `role_id` bigint(20) unsigned NOT NULL COMMENT '角色ID',
    `permission_id` bigint(20) unsigned NOT NULL COMMENT '权限ID',
    `guard_name` varchar(50) DEFAULT 'web' COMMENT '守卫名称',
    `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `role_permissions_unique` (`role_id`,`permission_id`,`guard_name`),
    KEY `role_permissions_role_id_index` (`role_id`),
    KEY `role_permissions_permission_id_index` (`permission_id`),
    KEY `role_permissions_guard_name_index` (`guard_name`),
    CONSTRAINT `role_permissions_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE,
    CONSTRAINT `role_permissions_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表';

-- 创建迁移记录表
CREATE TABLE IF NOT EXISTS `migrations` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `migration` varchar(255) NOT NULL COMMENT '迁移文件名',
    `batch` int(11) NOT NULL COMMENT '批次号',
    `ran_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '执行时间',
    PRIMARY KEY (`id`),
    KEY `migrations_migration_index` (`migration`),
    KEY `migrations_batch_index` (`batch`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='迁移记录表';

-- 插入基础角色数据
INSERT INTO `roles` (`name`, `display_name`, `description`, `guard_name`, `is_active`, `sort_order`) VALUES
('super_admin', '超级管理员', '系统超级管理员，拥有所有权限', 'web', 1, 1),
('admin', '管理员', '系统管理员，拥有大部分管理权限', 'web', 1, 2),
('moderator', '版主', '内容管理员，负责内容审核和管理', 'web', 1, 3),
('user', '普通用户', '普通注册用户', 'web', 1, 4),
('guest', '访客', '未登录访客', 'web', 1, 5);

-- 插入基础权限数据
INSERT INTO `permissions` (`name`, `display_name`, `group_name`, `guard_name`, `is_active`, `sort_order`) VALUES
-- 用户管理权限
('user.list', '查看用户列表', '用户管理', 'web', 1, 1),
('user.create', '创建用户', '用户管理', 'web', 1, 2),
('user.edit', '编辑用户', '用户管理', 'web', 1, 3),
('user.delete', '删除用户', '用户管理', 'web', 1, 4),
('user.view', '查看用户详情', '用户管理', 'web', 1, 5),

-- 角色管理权限
('role.list', '查看角色列表', '角色管理', 'web', 1, 1),
('role.create', '创建角色', '角色管理', 'web', 1, 2),
('role.edit', '编辑角色', '角色管理', 'web', 1, 3),
('role.delete', '删除角色', '角色管理', 'web', 1, 4),
('role.assign', '分配角色', '角色管理', 'web', 1, 5),

-- 权限管理权限
('permission.list', '查看权限列表', '权限管理', 'web', 1, 1),
('permission.create', '创建权限', '权限管理', 'web', 1, 2),
('permission.edit', '编辑权限', '权限管理', 'web', 1, 3),
('permission.delete', '删除权限', '权限管理', 'web', 1, 4),

-- 内容管理权限
('content.list', '查看内容列表', '内容管理', 'web', 1, 1),
('content.create', '创建内容', '内容管理', 'web', 1, 2),
('content.edit', '编辑内容', '内容管理', 'web', 1, 3),
('content.delete', '删除内容', '内容管理', 'web', 1, 4),
('content.publish', '发布内容', '内容管理', 'web', 1, 5),
('content.audit', '审核内容', '内容管理', 'web', 1, 6),

-- 系统管理权限
('system.config', '系统配置', '系统管理', 'web', 1, 1),
('system.log', '查看系统日志', '系统管理', 'web', 1, 2),
('system.monitor', '系统监控', '系统管理', 'web', 1, 3),
('system.backup', '数据备份', '系统管理', 'web', 1, 4),
('system.restore', '数据恢复', '系统管理', 'web', 1, 5),

-- API权限
('api.access', 'API访问', 'API管理', 'web', 1, 1),
('api.create', 'API创建', 'API管理', 'web', 1, 2),
('api.update', 'API更新', 'API管理', 'web', 1, 3),
('api.delete', 'API删除', 'API管理', 'web', 1, 4);

-- 插入默认管理员用户
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `phone`, `gender`, `bio`, `status`, `email_verified`, `phone_verified`, `email_verified_at`, `phone_verified_at`, `last_login_at`, `last_login_ip`) VALUES
('admin', 'admin@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '系统管理员', '13800138000', 'other', '系统默认管理员账号', 'active', 1, 1, NOW(), NOW(), NOW(), '127.0.0.1');

-- 分配超级管理员角色给admin用户
INSERT INTO `user_roles` (`user_id`, `role_id`, `guard_name`) 
SELECT u.id, r.id, 'web' 
FROM users u, roles r 
WHERE u.username = 'admin' AND r.name = 'super_admin';

-- 给超级管理员分配所有权限
INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`)
SELECT r.id, p.id, 'web'
FROM roles r, permissions p
WHERE r.name = 'super_admin';

-- 插入迁移记录
INSERT INTO `migrations` (`migration`, `batch`) VALUES
('2024_01_15_000001_create_users_table', 1),
('2024_01_15_000002_create_roles_table', 1),
('2024_01_15_000003_create_permissions_table', 1),
('2024_01_15_000004_create_user_roles_table', 1),
('2024_01_15_000005_create_role_permissions_table', 1),
('2024_01_15_000006_create_migrations_table', 1);

-- 创建测试用户
INSERT INTO `users` (`username`, `email`, `password`, `nickname`, `phone`, `gender`, `bio`, `status`, `email_verified`, `phone_verified`, `email_verified_at`, `phone_verified_at`, `last_login_at`, `last_login_ip`) VALUES
('test_user', 'test@fendx.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '测试用户', '13800138001', 'male', '这是一个测试用户账号', 'active', 1, 0, NOW(), NULL, NOW(), '127.0.0.1');

-- 分配普通用户角色给测试用户
INSERT INTO `user_roles` (`user_id`, `role_id`, `guard_name`) 
SELECT u.id, r.id, 'web' 
FROM users u, roles r 
WHERE u.username = 'test_user' AND r.name = 'user';

-- 给普通用户分配基础权限
INSERT INTO `role_permissions` (`role_id`, `permission_id`, `guard_name`)
SELECT r.id, p.id, 'web'
FROM roles r, permissions p
WHERE r.name = 'user' AND p.name IN ('user.view', 'content.list', 'content.create', 'content.edit', 'api.access');

-- 输出初始化完成信息
SELECT 'FendxPHP 数据库初始化完成！' as message;
SELECT '默认管理员账号: admin / password' as admin_info;
SELECT '测试用户账号: test_user / password' as test_info;
