/**
 * 账号工具函数测试
 */

const {
  calculateRemainingDays,
  isAuthorizationValid,
  addRemainingDays,
  addRemainingDaysToAccounts
} = require('../utils/account_utils');

// 测试剩余天数计算
function testCalculateRemainingDays() {
  console.log('\n===== 测试剩余天数计算 =====');

  try {
    const dayjs = require('dayjs');

    // 测试 1: 未来有效期
    const futureDate = dayjs().subtract(5, 'day').toDate();
    const remaining1 = calculateRemainingDays(futureDate, 30);
    console.log('✓ 未来有效期 (5天前授权30天):', remaining1, '天');
    console.assert(remaining1 === 25, `期望25天，实际${remaining1}天`);

    // 测试 2: 已过期
    const pastDate = dayjs().subtract(40, 'day').toDate();
    const remaining2 = calculateRemainingDays(pastDate, 30);
    console.log('✓ 已过期 (40天前授权30天):', remaining2, '天');
    console.assert(remaining2 === 0, `期望0天，实际${remaining2}天`);

    // 测试 3: 今天到期
    const todayDate = dayjs().startOf('day').toDate();
    const remaining3 = calculateRemainingDays(todayDate, 0);
    console.log('✓ 今天到期:', remaining3, '天');

    // 测试 4: 空值处理
    const remaining4 = calculateRemainingDays(null, 30);
    console.log('✓ 空授权日期:', remaining4, '天');
    console.assert(remaining4 === 0, '空值应返回0');

    const remaining5 = calculateRemainingDays(futureDate, 0);
    console.log('✓ 0天授权:', remaining5, '天');
    console.assert(remaining5 === 0, '0天授权应返回0');

    return true;
  } catch (error) {
    console.error('✗ 剩余天数计算测试失败:', error.message);
    return false;
  }
}

// 测试授权有效性检查
function testIsAuthorizationValid() {
  console.log('\n===== 测试授权有效性检查 =====');

  try {
    const dayjs = require('dayjs');

    // 测试 1: 有效授权
    const validDate = dayjs().subtract(5, 'day').toDate();
    const isValid = isAuthorizationValid(validDate, 30);
    console.log('✓ 有效授权 (5天前授权30天):', isValid ? '有效' : '无效');
    console.assert(isValid === true, '应该是有效的');

    // 测试 2: 过期授权
    const expiredDate = dayjs().subtract(40, 'day').toDate();
    const isExpired = isAuthorizationValid(expiredDate, 30);
    console.log('✓ 过期授权 (40天前授权30天):', isExpired ? '有效' : '无效');
    console.assert(isExpired === false, '应该是无效的');

    // 测试 3: 空值处理
    const isNull = isAuthorizationValid(null, 30);
    console.log('✓ 空授权日期:', isNull ? '有效' : '无效');
    console.assert(isNull === false, '空值应该无效');

    return true;
  } catch (error) {
    console.error('✗ 授权有效性检查测试失败:', error.message);
    return false;
  }
}

// 测试添加剩余天数
function testAddRemainingDays() {
  console.log('\n===== 测试添加剩余天数 =====');

  try {
    const dayjs = require('dayjs');

    // 测试 1: 普通对象
    const account1 = {
      id: 1,
      sn_code: 'SN001',
      authorization_date: dayjs().subtract(5, 'day').toDate(),
      authorization_days: 30
    };

    const result1 = addRemainingDays(account1);
    console.log('✓ 普通对象添加剩余天数:', result1.remaining_days, '天');
    console.assert(result1.remaining_days === 25, `期望25天，实际${result1.remaining_days}天`);

    // 测试 2: Sequelize实例模拟
    const account2 = {
      id: 2,
      sn_code: 'SN002',
      authorization_date: dayjs().subtract(10, 'day').toDate(),
      authorization_days: 15,
      toJSON: function() {
        return {
          id: this.id,
          sn_code: this.sn_code,
          authorization_date: this.authorization_date,
          authorization_days: this.authorization_days
        };
      }
    };

    const result2 = addRemainingDays(account2);
    console.log('✓ Sequelize实例添加剩余天数:', result2.remaining_days, '天');
    console.assert(result2.remaining_days === 5, `期望5天，实际${result2.remaining_days}天`);

    return true;
  } catch (error) {
    console.error('✗ 添加剩余天数测试失败:', error.message);
    return false;
  }
}

// 测试批量添加剩余天数
function testAddRemainingDaysToAccounts() {
  console.log('\n===== 测试批量添加剩余天数 =====');

  try {
    const dayjs = require('dayjs');

    const accounts = [
      {
        id: 1,
        authorization_date: dayjs().subtract(5, 'day').toDate(),
        authorization_days: 30
      },
      {
        id: 2,
        authorization_date: dayjs().subtract(10, 'day').toDate(),
        authorization_days: 15
      },
      {
        id: 3,
        authorization_date: dayjs().subtract(50, 'day').toDate(),
        authorization_days: 30
      }
    ];

    const results = addRemainingDaysToAccounts(accounts);
    console.log('✓ 批量添加剩余天数:');
    results.forEach((acc, index) => {
      console.log(`  账号${index + 1}: ${acc.remaining_days}天`);
    });

    console.assert(results.length === 3, '数组长度应该是3');
    console.assert(results[0].remaining_days === 25, '第1个账号剩余天数错误');
    console.assert(results[1].remaining_days === 5, '第2个账号剩余天数错误');
    console.assert(results[2].remaining_days === 0, '第3个账号剩余天数错误');

    // 测试空数组
    const emptyResults = addRemainingDaysToAccounts([]);
    console.log('✓ 空数组处理:', emptyResults.length === 0 ? '正确' : '错误');

    return true;
  } catch (error) {
    console.error('✗ 批量添加剩余天数测试失败:', error.message);
    return false;
  }
}

// 测试时区处理
function testTimezoneHandling() {
  console.log('\n===== 测试时区处理 =====');

  try {
    const dayjs = require('dayjs');
    const utc = require('dayjs/plugin/utc');
    dayjs.extend(utc);

    // 创建不同时区的日期
    const localDate = dayjs().subtract(5, 'day').toDate();
    const utcDate = dayjs().utc().subtract(5, 'day').toDate();

    const remaining1 = calculateRemainingDays(localDate, 30);
    const remaining2 = calculateRemainingDays(utcDate, 30);

    console.log('✓ 本地时区日期剩余天数:', remaining1, '天');
    console.log('✓ UTC时区日期剩余天数:', remaining2, '天');

    // 剩余天数应该接近（可能相差1天因为时区转换）
    const diff = Math.abs(remaining1 - remaining2);
    console.log('✓ 时区差异:', diff, '天');
    console.assert(diff <= 1, '时区差异应该不超过1天');

    return true;
  } catch (error) {
    console.error('✗ 时区处理测试失败:', error.message);
    return false;
  }
}

// 运行所有测试
async function runAllTests() {
  console.log('\n==================== 开始测试 ====================\n');

  const results = [];

  results.push(testCalculateRemainingDays());
  results.push(testIsAuthorizationValid());
  results.push(testAddRemainingDays());
  results.push(testAddRemainingDaysToAccounts());
  results.push(testTimezoneHandling());

  console.log('\n==================== 测试总结 ====================\n');

  const passed = results.filter(r => r).length;
  const total = results.length;

  console.log(`测试通过: ${passed}/${total}`);

  if (passed === total) {
    console.log('\n✓ 所有测试通过！\n');
    process.exit(0);
  } else {
    console.log('\n✗ 部分测试失败\n');
    process.exit(1);
  }
}

// 执行测试
if (require.main === module) {
  runAllTests().catch(error => {
    console.error('测试执行失败:', error);
    process.exit(1);
  });
}

module.exports = {
  testCalculateRemainingDays,
  testIsAuthorizationValid,
  testAddRemainingDays,
  testAddRemainingDaysToAccounts,
  testTimezoneHandling
};
