import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  ParseIntPipe,
  Query,
  HttpStatus,
} from '@nestjs/common';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiParam,
  ApiQuery,
  ApiBody,
} from '@nestjs/swagger';
import { QuestionnaireService } from './questionnaire.service';
import {
  CreateQuestionnaireFormDataDto,
  UpdateQuestionnaireFormDataDto,
} from './dto';
import { QuestionnaireFormData } from './entities/questionnaire-form-data.entity';

@ApiTags('questionnaire')
@Controller('questionnaire')
export class QuestionnaireController {
  constructor(private readonly questionnaireService: QuestionnaireService) {}

  @Post()
  @ApiOperation({ summary: 'Create a new questionnaire form data' })
  @ApiBody({ type: CreateQuestionnaireFormDataDto })
  @ApiResponse({
    status: HttpStatus.CREATED,
    description: 'Questionnaire form data created successfully',
    type: QuestionnaireFormData,
  })
  @ApiResponse({
    status: HttpStatus.BAD_REQUEST,
    description: 'Invalid input data',
  })
  async create(
    @Body() createQuestionnaireDto: CreateQuestionnaireFormDataDto,
  ): Promise<QuestionnaireFormData> {
    return await this.questionnaireService.create(createQuestionnaireDto);
  }

  @Get()
  @ApiOperation({ summary: 'Get all questionnaire form data' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'List of all questionnaire form data',
    type: [QuestionnaireFormData],
  })
  async findAll(): Promise<QuestionnaireFormData[]> {
    return await this.questionnaireService.findAll();
  }

  @Get('search/phone')
  @ApiOperation({ summary: 'Search questionnaire by phone number' })
  @ApiQuery({ name: 'phone', description: 'Phone number to search for' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Questionnaire form data found by phone number',
    type: [QuestionnaireFormData],
  })
  async findByPhoneNumber(
    @Query('phone') phone: string,
  ): Promise<QuestionnaireFormData[]> {
    return await this.questionnaireService.findByPhoneNumber(phone);
  }

  @Get('search/ophthalmologist')
  @ApiOperation({ summary: 'Search questionnaire by ophthalmologist name' })
  @ApiQuery({ name: 'name', description: 'Ophthalmologist name to search for' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Questionnaire form data found by ophthalmologist name',
    type: [QuestionnaireFormData],
  })
  async findByOphthalmologistName(
    @Query('name') name: string,
  ): Promise<QuestionnaireFormData[]> {
    return await this.questionnaireService.findByOphthalmologistName(name);
  }

  @Get('uuid/:uuid')
  @ApiOperation({ summary: 'Get questionnaire form data by UUID' })
  @ApiParam({ name: 'uuid', description: 'Questionnaire UUID' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Questionnaire form data found',
    type: QuestionnaireFormData,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Questionnaire not found',
  })
  async findByUuid(
    @Param('uuid') uuid: string,
  ): Promise<QuestionnaireFormData> {
    return await this.questionnaireService.findByUuid(uuid);
  }

  @Get(':id')
  @ApiOperation({ summary: 'Get questionnaire form data by ID' })
  @ApiParam({ name: 'id', description: 'Questionnaire ID' })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Questionnaire form data found',
    type: QuestionnaireFormData,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Questionnaire not found',
  })
  async findOne(
    @Param('id', ParseIntPipe) id: number,
  ): Promise<QuestionnaireFormData> {
    return await this.questionnaireService.findOne(id);
  }

  @Get('priority/:uuid')
  @ApiOperation({ summary: 'Calculate therapeutic adherence priority for a questionnaire' })
  async getPriority(@Param('uuid') uuid: string) {
    return await this.questionnaireService.calculatePriorities(uuid);
  }


  @Patch(':id')
  @ApiOperation({ summary: 'Update questionnaire form data' })
  @ApiParam({ name: 'id', description: 'Questionnaire ID' })
  @ApiBody({ type: UpdateQuestionnaireFormDataDto })
  @ApiResponse({
    status: HttpStatus.OK,
    description: 'Questionnaire form data updated successfully',
    type: QuestionnaireFormData,
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Questionnaire not found',
  })
  @ApiResponse({
    status: HttpStatus.BAD_REQUEST,
    description: 'Invalid input data',
  })
  async update(
    @Param('id', ParseIntPipe) id: number,
    @Body() updateQuestionnaireDto: UpdateQuestionnaireFormDataDto,
  ): Promise<QuestionnaireFormData> {
    return await this.questionnaireService.update(id, updateQuestionnaireDto);
  }

  @Delete(':id')
  @ApiOperation({ summary: 'Delete questionnaire form data' })
  @ApiParam({ name: 'id', description: 'Questionnaire ID' })
  @ApiResponse({
    status: HttpStatus.NO_CONTENT,
    description: 'Questionnaire form data deleted successfully',
  })
  @ApiResponse({
    status: HttpStatus.NOT_FOUND,
    description: 'Questionnaire not found',
  })
  async remove(@Param('id', ParseIntPipe) id: number): Promise<void> {
    return await this.questionnaireService.remove(id);
  }
}
