import { Controller, Get, Post, Body, Req, UseGuards, HttpCode, HttpStatus } from '@nestjs/common';
import { AdsService } from './ads.service';
import { AuthGuard } from '../auth/auth.guard';
import { AttestationGuard } from '@/middleware/attestation.guard';
import { SensitiveRateLimitGuard } from '@/middleware/sensitive-rate-limit.guard';
import { StartRewardDto, ClaimRewardDto } from './ads.dto';

@Controller('ads')
export class AdsController {
  constructor(private readonly adsService: AdsService) {}

  @Get('active')
  @HttpCode(HttpStatus.OK)
  async getActiveAds() {
    return this.adsService.getActiveAds();
  }

  // AdMob server-side verification callbacks (public; secret-token gated in service).
  @Get('reward/ssv/admob')
  admobSsv(@Req() req: any) {
    return this.handleSsv(req);
  }

  @Get('reward/ssv/admob-callback')
  admobSsvCallback(@Req() req: any) {
    return this.handleSsv(req);
  }

  private handleSsv(req: any) {
    const payload: Record<string, unknown> = { ...req.query };
    const originalUrl = String(req.originalUrl || '');
    const idx = originalUrl.indexOf('?');
    const rawQuery = idx >= 0 ? originalUrl.slice(idx + 1) : '';
    return this.adsService.verifyAdmobReward(payload, rawQuery);
  }

  @Post('reward/start')
  @UseGuards(AuthGuard, SensitiveRateLimitGuard, AttestationGuard)
  startReward(@Req() req: any, @Body() body: StartRewardDto) {
    return this.adsService.startRewardIntent(req.user?.id, {
      rewardType: body.rewardType,
      adUnitId: body.adUnitId,
      adNetwork: body.adNetwork,
    });
  }

  @Post('reward/claim')
  @UseGuards(AuthGuard, SensitiveRateLimitGuard, AttestationGuard)
  claimReward(@Req() req: any, @Body() body: ClaimRewardDto) {
    return this.adsService.claimRewardIntent(req.user?.id, String(body.intentToken || ''));
  }

  @Post('reward/callback-complete')
  @UseGuards(AuthGuard, SensitiveRateLimitGuard, AttestationGuard)
  completeRewardFromCallback(@Req() req: any, @Body() body: ClaimRewardDto) {
    return this.adsService.claimRewardIntent(req.user?.id, String(body.intentToken || ''));
  }
}
