import { Controller, Get, Req, Res } from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import type { Request, Response } from 'express';
import { CoreGrpcService } from '../core-grpc.service';
import { buildFedcmWebIdentityManifest, resolveFedcmEndpoints } from '../lib/fedcm-config';
import { buildOpenIdConfiguration, resolveOAuthIssuer } from '../lib/oauth-issuer';

@ApiTags('OpenID Connect')
@Controller('.well-known')
export class WellKnownController {
  constructor(private readonly core: CoreGrpcService) {}

  @Get('web-identity')
  @ApiOperation({
    summary: 'FedCM web identity manifest',
    description: 'Манифест Federated Credential Management API, указывающий на конфигурацию провайдера.'
  })
  async webIdentity(@Req() req: Request, @Res({ passthrough: true }) res: Response) {
    // Публичный discovery-манифест: без Sec-Fetch-Dest проверки (браузер FedCM шлёт
    // webidentity или empty; ручной заход с document не должен ломать One Tap).
    res.setHeader('Content-Type', 'application/json; charset=utf-8');
    res.setHeader('Cache-Control', 'public, max-age=300');
    res.setHeader('Access-Control-Allow-Origin', '*');
    const endpoints = await resolveFedcmEndpoints(this.core, req);
    return buildFedcmWebIdentityManifest(endpoints);
  }

  @Get('openid-configuration')
  @ApiOperation({
    summary: 'OpenID Connect Discovery',
    description: 'Метаданные OIDC-провайдера. Issuer и endpoints берутся из PUBLIC_API_URL в настройках.'
  })
  async openIdConfiguration() {
    const issuer = await resolveOAuthIssuer(this.core);
    return buildOpenIdConfiguration(issuer);
  }

  @Get('jwks.json')
  @ApiOperation({
    summary: 'JWKS',
    description: 'Пустой набор ключей: токены подписываются HS256 на стороне IdP. Для проверки id_token используйте userinfo.'
  })
  jwks() {
    return { keys: [] };
  }
}

@ApiTags('OpenID Connect')
@Controller('oauth/authorize')
export class OAuthAuthorizeDiscoveryController {
  constructor(private readonly core: CoreGrpcService) {}

  @Get('.well-known/openid-configuration')
  @ApiOperation({
    summary: 'OpenID Discovery (alias)',
    description: 'Совместимость с клиентами, ошибочно использующими authorization endpoint как issuer.'
  })
  async openIdConfigurationAlias() {
    const issuer = await resolveOAuthIssuer(this.core);
    return buildOpenIdConfiguration(issuer);
  }
}
