/**
 * 마이그레이션: 기존 작업자에게 계정 자동 생성
 * 작성일: 2026-01-19
 *
 * 작업 내용:
 * 1. 계정이 없는 기존 작업자 조회
 * 2. 각 작업자에 대해 users 테이블에 계정 생성
 * 3. username은 이름 기반으로 자동 생성 (예: 홍길동 → hong.gildong)
 * 4. 초기 비밀번호는 '1234'로 통일 (첫 로그인 시 변경 권장)
 * 5. 현재 연도 연차 잔액 초기화 (workers.annual_leave 사용)
 */

const bcrypt = require('bcrypt');
const { generateUniqueUsername } = require('../../utils/hangulToRoman');

exports.up = async function(knex) {

  // 1. 계정이 없는 작업자 조회
  const workersWithoutAccount = await knex('workers')
    .leftJoin('users', 'workers.worker_id', 'users.worker_id')
    .whereNull('users.user_id')
    .select(
      'workers.worker_id',
      'workers.worker_name',
      'workers.email',
      'workers.status',
      'workers.annual_leave'
    );


  if (workersWithoutAccount.length === 0) {
    return;
  }

  // 2. 각 작업자에 대해 계정 생성
  const initialPassword = '1234'; // 초기 비밀번호
  const hashedPassword = await bcrypt.hash(initialPassword, 10);

  // User 역할 ID 조회
  const userRole = await knex('roles')
    .where('name', 'User')
    .first();

  if (!userRole) {
    throw new Error('User 역할이 존재하지 않습니다. 권한 마이그레이션을 먼저 실행하세요.');
  }

  let successCount = 0;
  let errorCount = 0;

  for (const worker of workersWithoutAccount) {
    try {
      // username 생성 (중복 체크 포함)
      const username = await generateUniqueUsername(worker.worker_name, knex);

      // 계정 생성
      await knex('users').insert({
        username: username,
        password: hashedPassword,
        name: worker.worker_name,
        email: worker.email,
        worker_id: worker.worker_id,
        role_id: userRole.id,
        is_active: worker.status === 'active' ? 1 : 0,
        created_at: knex.fn.now(),
        updated_at: knex.fn.now()
      });

      successCount++;

      // 현재 연도 연차 잔액 초기화
      const currentYear = new Date().getFullYear();
      await knex('worker_vacation_balance').insert({
        worker_id: worker.worker_id,
        year: currentYear,
        total_annual_leave: worker.annual_leave || 15,
        used_annual_leave: 0,
        created_at: knex.fn.now(),
        updated_at: knex.fn.now()
      });

    } catch (error) {
      console.error(` ${worker.worker_name} 계정 생성 실패:`, error.message);
      errorCount++;
    }
  }

};

exports.down = async function(knex) {

  // 이 마이그레이션으로 생성된 계정은 구분하기 어려우므로
  // rollback 시 주의가 필요합니다.
};
