import {
  Controller,
  Get,
  Post,
  Delete,
  Param,
  Body,
  HttpCode,
} from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { PaymentServicesApplication } from './PaymentServicesApplication';
import { EditPaymentMethodDTO } from './types';

@ApiTags('Payment Services')
@Controller('payment-services')
export class PaymentServicesController {
  constructor(
    private readonly paymentServicesApp: PaymentServicesApplication,
  ) {}

  @Get('/')
  async getPaymentServicesSpecificInvoice() {
    const paymentServices =
      await this.paymentServicesApp.getPaymentServicesForInvoice();

    return { paymentServices };
  }

  @Get('/state')
  async getPaymentMethodsState() {
    const paymentMethodsState =
      await this.paymentServicesApp.getPaymentMethodsState();

    return { data: paymentMethodsState };
  }

  @Get('/:paymentServiceId')
  async getPaymentService(@Param('paymentServiceId') paymentServiceId: number) {
    const paymentService =
      await this.paymentServicesApp.getPaymentService(paymentServiceId);

    return { data: paymentService };
  }

  @Post('/:paymentMethodId')
  @HttpCode(200)
  async updatePaymentMethod(
    @Param('paymentMethodId') paymentMethodId: number,
    @Body() updatePaymentMethodDTO: EditPaymentMethodDTO,
  ) {
    await this.paymentServicesApp.editPaymentMethod(
      paymentMethodId,
      updatePaymentMethodDTO,
    );
    return {
      id: paymentMethodId,
      message: 'The given payment method has been updated.',
    };
  }

  @Delete('/:paymentMethodId')
  @HttpCode(200)
  async deletePaymentMethod(@Param('paymentMethodId') paymentMethodId: number) {
    await this.paymentServicesApp.deletePaymentMethod(paymentMethodId);

    return {
      id: paymentMethodId,
      message: 'The payment method has been deleted.',
    };
  }
}
