import { Inject } from '@nestjs/common';
import { CommandHandler, type EventBus, type ICommandHandler } from '@nestjs/cqrs';
import { USER_REPOSITORY, type IUserRepository } from '@modules/auth/domain/repositories/user.repository';
import { NotFoundException, ValidationException } from '@modules/shared';
import { UserBannedEvent } from '../../../domain/events/user-banned.event';
import { UserUnbannedEvent } from '../../../domain/events/user-unbanned.event';
import { UpdateUserStatusCommand } from './update-user-status.command';

export interface UpdateUserStatusResult {
  userId: string;
  isActive: boolean;
  message: string;
}

@CommandHandler(UpdateUserStatusCommand)
export class UpdateUserStatusHandler implements ICommandHandler<UpdateUserStatusCommand> {
  constructor(
    @Inject(USER_REPOSITORY) private readonly userRepo: IUserRepository,
    private readonly eventBus: EventBus,
  ) {}

  async execute(command: UpdateUserStatusCommand): Promise<UpdateUserStatusResult> {
    const user = await this.userRepo.findById(command.userId);
    if (!user) {
      throw new NotFoundException('Người dùng không tồn tại');
    }

    if (user.role === 'ADMIN') {
      throw new ValidationException('Không thể thay đổi trạng thái tài khoản admin', {
        userId: command.userId,
      });
    }

    if (user.isActive === command.isActive) {
      const statusLabel = command.isActive ? 'đang hoạt động' : 'đã bị vô hiệu hóa';
      throw new ValidationException(`Người dùng ${statusLabel}`, {
        userId: command.userId,
      });
    }

    if (command.isActive) {
      user.activate();
      await this.userRepo.update(user);
      this.eventBus.publish(new UserUnbannedEvent(user.id, command.adminId));

      return {
        userId: user.id,
        isActive: true,
        message: 'Người dùng đã được kích hoạt',
      };
    }

    user.deactivate();
    await this.userRepo.update(user);
    this.eventBus.publish(new UserBannedEvent(user.id, command.adminId, command.reason));

    return {
      userId: user.id,
      isActive: false,
      message: 'Người dùng đã bị vô hiệu hóa',
    };
  }
}
