import {
  Body,
  Controller,
  Get,
  Param,
  ParseIntPipe,
  Post,
} from '@nestjs/common';
import { MessageDto } from '../message/dto/message.dto';
import { ClientMessageDto } from './dto/client-message.dto';
import { CreateTicketRequestDto } from './dto/create-ticket-request.dto';
import { TicketListItemDto } from './dto/ticket-list-item.dto';
import { Ticket } from './ticket.entity';
import { CheckLicenseeForUnreadTicketsWorkflow } from './workflows/check-licensee-for-unread-tickets/check-licensee-for-unread-tickets.workflow';
import { CreateTicketWorkflow } from './workflows/create-ticket/create-ticket.workflow';
import { GetTicketDetailsWorkflow } from './workflows/get-ticket-details/get-ticket-details.workflow';
import { PostTicketClientMessageWorkflow } from './workflows/post-ticket-client-message/post-ticket-client-message.workflow';

@Controller('ticket')
export class TicketController {
  constructor(
    private createTicketWorkflow: CreateTicketWorkflow,
    private checkLicenseeForUnreadTicketsWorkflow: CheckLicenseeForUnreadTicketsWorkflow,
    private getTicketDetailsWorkflow: GetTicketDetailsWorkflow,
    private postTicketClientMessageWorkflow: PostTicketClientMessageWorkflow
  ) {}

  @Post()
  async create(@Body() requestDto: CreateTicketRequestDto) {
    return await this.createTicketWorkflow.create(requestDto);
  }

  @Get(':licenseeId')
  async getTicketList(@Param('licenseeId', ParseIntPipe) licenseeId: number) {
    const tickets = await Ticket.find({
      where: { licensee: licenseeId },
      order: { createdOn: 'DESC' },
    });
    return await Promise.all(
      tickets.map((t) => TicketListItemDto.createFromEntity(t))
    );
  }

  @Get(':licenseeId/unread')
  async checkUnread(@Param('licenseeId', ParseIntPipe) licenseeId: number) {
    return await this.checkLicenseeForUnreadTicketsWorkflow.check(licenseeId);
  }

  @Get(':licenseeId/:ticketId')
  async getTicketDetails(
    @Param('licenseeId', ParseIntPipe) licenseeId: number,
    @Param('ticketId', ParseIntPipe) ticketId: number
  ) {
    return await this.getTicketDetailsWorkflow.get(licenseeId, ticketId);
  }

  @Post(':licenseeId/:ticketId/message')
  async postTicketMessage(
    @Param('licenseeId', ParseIntPipe) licenseeId: number,
    @Param('ticketId', ParseIntPipe) ticketId: number,
    @Body() clientMessageDto: ClientMessageDto
  ) {
    return MessageDto.createFromEntity(
      await this.postTicketClientMessageWorkflow.post(
        ticketId,
        licenseeId,
        clientMessageDto
      )
    );
  }
}
