import { Controller, Get, Logger, Post, Res, UseGuards, Req, UseInterceptors } from '@nestjs/common';
import { AuthService } from '../../service/auth.service';
import { LoggingInterceptor } from '../../client/interceptors/logging.interceptor';
import { ApiTags, ApiResponse, ApiOperation, ApiExcludeEndpoint } from '@nestjs/swagger';
import { AuthGuard, RolesGuard } from '../../security';
import { oauth2Config } from '../../security/oauth2.config';
<%_ if (skipClient) { _%>
import { config } from '../../config';
<%_ } _%>

@Controller()
@UseInterceptors(LoggingInterceptor)
@ApiTags('user-oauth2-controller')
export class UserOauth2Controller {
  logger = new Logger('UserOauth2Controller');

  constructor(private readonly authService: AuthService) { }

  @ApiExcludeEndpoint()
  @UseGuards(AuthGuard, RolesGuard)
  @Get('/login/oauth2/code/oidc')
  @ApiOperation({ summary: 'Backend redirect' })
  @ApiResponse({
    status: 200,
    description: 'Redirect oauth2 oidc after login',
  })
  redirect(@Req() req: any, @Res() res: any): any {
    res.session = req.session;
    res.session.user = req.user;
    res.session.idToken = req.idToken;
    <%_ if (skipClient) { _%>
    let url = config.get('jhipster.swagger.path');
    <%_ } else { _%>
    let url = '/';
    <%_ } _%>
    if (oauth2Config.isOktaProvider) {
        url = req.session.url;
    }
    return res.redirect(url || '/');

  }

  @ApiExcludeEndpoint()
  @Get('/oauth2/authorization/oidc')
  @UseGuards(AuthGuard, RolesGuard)
  @ApiOperation({ summary: 'Perform login oauth2 oidc from client' })
  @ApiResponse({
    status: 200,
    description: 'Redirect to login oauth2 oidc',
  })
  loginAuthOidc(): void {
    return;
  }

  @ApiExcludeEndpoint()
  @Post('/api/logout')
  @ApiOperation({ summary: 'Perform logout oauth2 oidc from client' })
  @ApiResponse({
    status: 201,
    description: 'Logout oauth2 oidc',
  })
  logoutAuthOidc(@Req() req: any): any {
    let idTokenFromSession;
    if (req.session && req.session.user) {
      idTokenFromSession = req.session.user.idToken;
      req.session.destroy();
      return { idToken: idTokenFromSession, logoutUrl: oauth2Config.logoutUrl };
    }
    return;
  }

}
