/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
exports.up = function(knex) {
  return knex.schema
    // 1. roles 테이블 생성
    .createTable('roles', function(table) {
      table.increments('id').primary();
      table.string('name', 50).notNullable().unique();
      table.string('description', 255);
      table.timestamps(true, true);
    })
    // 2. permissions 테이블 생성
    .createTable('permissions', function(table) {
      table.increments('id').primary();
      table.string('name', 100).notNullable().unique(); // 예: 'user:create'
      table.string('description', 255);
      table.timestamps(true, true);
    })
    // 3. role_permissions (역할-권한) 조인 테이블 생성
    .createTable('role_permissions', function(table) {
      table.integer('role_id').unsigned().notNullable().references('id').inTable('roles').onDelete('CASCADE');
      table.integer('permission_id').unsigned().notNullable().references('id').inTable('permissions').onDelete('CASCADE');
      table.primary(['role_id', 'permission_id']);
    })
    // 4. users 테이블에 role_id 추가 및 기존 컬럼 삭제
    .table('users', function(table) {
      table.integer('role_id').unsigned().references('id').inTable('roles').onDelete('SET NULL').after('email');
      // 기존 컬럼들은 삭제 또는 비활성화 (데이터 보존을 위해 일단 이름 변경)
      table.renameColumn('role', '_role_old');
      table.renameColumn('access_level', '_access_level_old');
    })
    // 5. user_permissions (사용자-개별 권한) 조인 테이블 생성
    .createTable('user_permissions', function(table) {
      table.integer('user_id').notNullable().references('user_id').inTable('users').onDelete('CASCADE');
      table.integer('permission_id').unsigned().notNullable().references('id').inTable('permissions').onDelete('CASCADE');
      table.primary(['user_id', 'permission_id']);
    });
};

/**
 * @param { import("knex").Knex } knex
 * @returns { Promise<void> }
 */
exports.down = function(knex) {
  return knex.schema
    .dropTableIfExists('user_permissions')
    .dropTableIfExists('role_permissions')
    .dropTableIfExists('permissions')
    .dropTableIfExists('roles')
    .table('users', function(table) {
      table.dropColumn('role_id');
      table.renameColumn('_role_old', 'role');
      table.renameColumn('_access_level_old', 'access_level');
    });
};