import {
  Controller,
  Get,
  Post,
  Body,
  Put,
  Param,
  Delete,
  ParseIntPipe,
  Query,
  HttpStatus,
} from '@nestjs/common';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiParam,
  ApiQuery,
  ApiBody,
} from '@nestjs/swagger';
import { DateIvtService } from './date-ivt.service';
import { CreateDateIvtDto, UpdateDateIvtDto } from './dto';
import { DateIvt } from './entities/date-ivt.entity';

@ApiTags('date-ivt')
@Controller('date-ivt')
export class DateIvtController {
  constructor(private readonly dateIvtService: DateIvtService) {}

  @Post()
  @ApiOperation({ summary: 'Create a new date IVT entry' })
  @ApiBody({ type: CreateDateIvtDto })
  @ApiResponse({
    status: HttpStatus.CREATED,
    description: 'Date IVT entry created successfully',
    type: DateIvt,
  })
  @ApiResponse({
    status: HttpStatus.CONFLICT,
    description: 'A date IVT entry already exists for this combination',
  })
  @ApiResponse({
    status: HttpStatus.BAD_REQUEST,
    description: 'Invalid input data',
  })
  async create(@Body() createDateIvtDto: CreateDateIvtDto): Promise<DateIvt> {
    return await this.dateIvtService.create(createDateIvtDto);
  }

  @Get()
  @ApiOperation({ summary: 'Get all date IVT entries' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'List of all date IVT entries',
    type: [DateIvt],
  })
  async findAll(): Promise<DateIvt[]> {
    return await this.dateIvtService.findAll();
  }

  @Get('search/phone')
  @ApiOperation({ summary: 'Search date IVT entries by phone number' })
  @ApiQuery({ name: 'phone', description: 'Phone number to search for' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entries found by phone number',
    type: [DateIvt],
  })
  async findByPhoneNumber(@Query('phone') phone: string): Promise<DateIvt[]> {
    return await this.dateIvtService.findByPhoneNumber(phone);
  }

  @Get('search/questionnaire/:id')
  @ApiOperation({ summary: 'Search date IVT entries by questionnaire ID' })
  @ApiParam({ name: 'id', description: 'Questionnaire ID' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entries found by questionnaire ID',
    type: [DateIvt],
  })
  async findByQuestionnaireId(
    @Param('id', ParseIntPipe) id: number,
  ): Promise<DateIvt[]> {
    return await this.dateIvtService.findByQuestionnaireId(id);
  }

  @Get('search/date-range')
  @ApiOperation({ summary: 'Search date IVT entries by date range' })
  @ApiQuery({ name: 'startDate', description: 'Start date (YYYY-MM-DD)' })
  @ApiQuery({ name: 'endDate', description: 'End date (YYYY-MM-DD)' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entries found by date range',
    type: [DateIvt],
  })
  async findByDateRange(
    @Query('startDate') startDate: string,
    @Query('endDate') endDate: string,
  ): Promise<DateIvt[]> {
    return await this.dateIvtService.findByDateRange(startDate, endDate);
  }

  @Get('uuid/:uuid')
  @ApiOperation({ summary: 'Get date IVT entry by UUID' })
  @ApiParam({ name: 'uuid', description: 'Date IVT entry UUID' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entry found',
    type: DateIvt,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Date IVT entry not found',
  })
  async findByUuid(@Param('uuid') uuid: string): Promise<DateIvt> {
    return await this.dateIvtService.findByUuid(uuid);
  }

  @Get(':id')
  @ApiOperation({ summary: 'Get date IVT entry by ID' })
  @ApiParam({ name: 'id', description: 'Date IVT entry ID' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entry found',
    type: DateIvt,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Date IVT entry not found',
  })
  async findOne(@Param('id', ParseIntPipe) id: number): Promise<DateIvt> {
    return await this.dateIvtService.findOne(id);
  }

  @Put('uuid/:uuid')
  @ApiOperation({ summary: 'Update date IVT entry by UUID' })
  @ApiParam({ name: 'uuid', description: 'Date IVT entry UUID' })
  @ApiBody({ type: UpdateDateIvtDto })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entry updated successfully',
    type: DateIvt,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Date IVT entry not found',
  })
  @ApiResponse({
    status: HttpStatus.BAD_REQUEST,
    description: 'Invalid input data',
  })
  async updateByUuid(
    @Param('uuid') uuid: string,
    @Body() updateDateIvtDto: UpdateDateIvtDto,
  ): Promise<DateIvt> {
    return await this.dateIvtService.updateByUuid(uuid, updateDateIvtDto);
  }

  @Put(':id')
  @ApiOperation({ summary: 'Update date IVT entry by ID' })
  @ApiParam({ name: 'id', description: 'Date IVT entry ID' })
  @ApiBody({ type: UpdateDateIvtDto })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Date IVT entry updated successfully',
    type: DateIvt,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Date IVT entry not found',
  })
  @ApiResponse({
    status: HttpStatus.BAD_REQUEST,
    description: 'Invalid input data',
  })
  async update(
    @Param('id', ParseIntPipe) id: number,
    @Body() updateDateIvtDto: UpdateDateIvtDto,
  ): Promise<DateIvt> {
    return await this.dateIvtService.update(id, updateDateIvtDto);
  }

  @Delete(':id')
  @ApiOperation({ summary: 'Delete date IVT entry by ID' })
  @ApiParam({ name: 'id', description: 'Date IVT entry ID' })
  @ApiResponse({
    status: HttpStatus.NO_CONTENT,
    description: 'Date IVT entry deleted successfully',
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Date IVT entry not found',
  })
  async remove(@Param('id', ParseIntPipe) id: number): Promise<void> {
    return await this.dateIvtService.remove(id);
  }
}
