import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger';
import { BlockchainIntegrationService } from '../../application/services/blockchain.service';
import { CurrentUser, CurrentUserPayload } from '../../shared/decorators/current-user.decorator';
import { AdminOnly } from '../../shared/guards/jwt-auth.guard';
import { AssetType, WithdrawStatus } from '@prisma/client';
import Decimal from 'decimal.js';

class CreateWithdrawRequestDto {
  assetType: AssetType;
  amount: string;
  toAddress: string;
}

class BindAddressDto {
  kavaAddress: string;
}

class CreateSwapRequestDto {
  fromAsset: AssetType;
  toAsset: AssetType;
  fromAmount: string;
  minToAmount: string;
}

@ApiTags('Blockchain')
@Controller('blockchain')
@ApiBearerAuth()
export class BlockchainController {
  constructor(private readonly blockchainService: BlockchainIntegrationService) {}

  // ==================== User Operations ====================

  @Get('my/address')
  @ApiOperation({ summary: '获取我的绑定地址' })
  async getMyAddress(@CurrentUser() user: CurrentUserPayload) {
    return this.blockchainService.getUserAddressBinding(user.accountSequence);
  }

  @Post('my/address')
  @ApiOperation({ summary: '绑定KAVA地址' })
  async bindAddress(
    @CurrentUser() user: CurrentUserPayload,
    @Body() dto: BindAddressDto,
  ) {
    await this.blockchainService.bindUserAddress(user.accountSequence, dto.kavaAddress);
    return { success: true, kavaAddress: dto.kavaAddress };
  }

  @Get('my/withdrawals')
  @ApiOperation({ summary: '获取我的提现记录' })
  @ApiQuery({ name: 'status', required: false })
  @ApiQuery({ name: 'limit', required: false, type: Number })
  @ApiQuery({ name: 'offset', required: false, type: Number })
  async getMyWithdrawals(
    @CurrentUser() user: CurrentUserPayload,
    @Query('status') status?: WithdrawStatus,
    @Query('limit') limit?: number,
    @Query('offset') offset?: number,
  ) {
    return this.blockchainService.getUserWithdrawRequests(user.accountSequence, {
      status,
      limit: limit ? Number(limit) : undefined,
      offset: offset ? Number(offset) : undefined,
    });
  }

  @Post('my/withdraw')
  @ApiOperation({ summary: '创建提现请求' })
  async createWithdrawRequest(
    @CurrentUser() user: CurrentUserPayload,
    @Body() dto: CreateWithdrawRequestDto,
  ) {
    return this.blockchainService.createWithdrawRequest(
      user.accountSequence,
      dto.assetType,
      new Decimal(dto.amount),
      dto.toAddress,
    );
  }

  @Post('my/swap')
  @ApiOperation({ summary: '创建DEX Swap请求' })
  async createSwapRequest(
    @CurrentUser() user: CurrentUserPayload,
    @Body() dto: CreateSwapRequestDto,
  ) {
    return this.blockchainService.createSwapRequest(
      user.accountSequence,
      dto.fromAsset,
      dto.toAsset,
      new Decimal(dto.fromAmount),
      new Decimal(dto.minToAmount),
    );
  }

  // ==================== Admin Operations ====================

  @Get('withdrawals/:id')
  @AdminOnly()
  @ApiOperation({ summary: '获取提现请求详情' })
  async getWithdrawRequest(@Param('id') id: string) {
    return this.blockchainService.getWithdrawRequest(id);
  }

  @Post('withdrawals/:id/approve')
  @AdminOnly()
  @ApiOperation({ summary: '审批提现请求' })
  async approveWithdraw(
    @Param('id') id: string,
    @CurrentUser() user: CurrentUserPayload,
  ) {
    return this.blockchainService.approveWithdrawRequest(id, user.userId);
  }

  @Post('withdrawals/:id/execute')
  @AdminOnly()
  @ApiOperation({ summary: '执行链上提现' })
  async executeWithdraw(@Param('id') id: string) {
    return this.blockchainService.executeWithdraw(id);
  }

  @Post('withdrawals/:id/confirm')
  @AdminOnly()
  @ApiOperation({ summary: '确认提现完成' })
  async confirmWithdraw(@Param('id') id: string) {
    return this.blockchainService.confirmWithdrawComplete(id);
  }
}
