import {
  Body,
  Controller,
  Delete,
  Get,
  HttpCode,
  Param,
  ParseUUIDPipe,
  Patch,
  Post,
} from '@nestjs/common';
import type { AuthenticatedUser } from '../../common/auth/authenticated-user';
import { CurrentUser } from '../../common/auth/current-user.decorator';
import {
  CreatePortfolioTransactionDto,
  UpdatePortfolioTransactionDto,
} from './dto/portfolio-transaction.dto';
import { CreatePortfolioDto, UpdatePortfolioDto } from './dto/portfolio.dto';
import { PortfolioService } from './portfolio.service';

@Controller('portfolios')
export class PortfolioController {
  constructor(private readonly portfolios: PortfolioService) {}

  @Get()
  list(@CurrentUser() user: AuthenticatedUser) {
    return this.portfolios.list(user.id);
  }

  @Post()
  create(@CurrentUser() user: AuthenticatedUser, @Body() input: CreatePortfolioDto) {
    return this.portfolios.create(user.id, input);
  }

  @Patch(':portfolioId')
  update(
    @CurrentUser() user: AuthenticatedUser,
    @Param('portfolioId', ParseUUIDPipe) portfolioId: string,
    @Body() input: UpdatePortfolioDto,
  ) {
    return this.portfolios.update(user.id, portfolioId, input);
  }

  @Delete(':portfolioId')
  @HttpCode(204)
  delete(
    @CurrentUser() user: AuthenticatedUser,
    @Param('portfolioId', ParseUUIDPipe) portfolioId: string,
  ) {
    return this.portfolios.delete(user.id, portfolioId);
  }

  @Get(':portfolioId/transactions')
  listTransactions(
    @CurrentUser() user: AuthenticatedUser,
    @Param('portfolioId', ParseUUIDPipe) portfolioId: string,
  ) {
    return this.portfolios.listTransactions(user.id, portfolioId);
  }

  @Post(':portfolioId/transactions')
  createTransaction(
    @CurrentUser() user: AuthenticatedUser,
    @Param('portfolioId', ParseUUIDPipe) portfolioId: string,
    @Body() input: CreatePortfolioTransactionDto,
  ) {
    return this.portfolios.createTransaction(user.id, portfolioId, input);
  }

  @Patch('transactions/:transactionId')
  updateTransaction(
    @CurrentUser() user: AuthenticatedUser,
    @Param('transactionId', ParseUUIDPipe) transactionId: string,
    @Body() input: UpdatePortfolioTransactionDto,
  ) {
    return this.portfolios.updateTransaction(user.id, transactionId, input);
  }

  @Delete('transactions/:transactionId')
  @HttpCode(204)
  deleteTransaction(
    @CurrentUser() user: AuthenticatedUser,
    @Param('transactionId', ParseUUIDPipe) transactionId: string,
  ) {
    return this.portfolios.deleteTransaction(user.id, transactionId);
  }
}
