import { Body, Controller, Delete, Get, NotFoundException, Param, ParseIntPipe, Post, Put, Query } from '@nestjs/common';
import { UnidSaudeService } from './services/unid-saude/unid-saude.service';
import { CreateUnidSaudeDto } from './dtos/createUnidSaude.dto';
import { CreatePacienteDto } from './dtos/createPacienteDto.dto';
import { PacienteService } from './services/paciente/paciente.service';
import { AtendimentoService } from './services/atendimento/atendimento.service';
import { CreateAtendimentoDto } from './dtos/createAtendimentoDto.dto';
import { CidService } from './services/cid/cid.service';

    @Controller('unid-saude')
    export class UnidSaudeController {
          constructor(private unidSaudeService: UnidSaudeService,
            private pacienteService: PacienteService,
            private atendimentoService: AtendimentoService,
            private cidService: CidService
            ) {}
            //TRAZER TODAS AS UNID-SAUDE
          @Get('/')
          getAllUnidSaude() {
            return this.unidSaudeService.findAllUnid();
          }
          //TRAZER TODOS OS PACIENTES INDEPENDENTE DA UNID-SAUDE
          @Get('/paciente')
          getAllPaciente() {
            return this.pacienteService.findAllPaciente();
          }

          //BUSCAR PACIENTE
          @Get('/paciente/:id')
          async getPaciente(@Param('id') id: number) {
            return this.pacienteService.findOneById(id);
          }

          //TRAZER TODOS OS CID
          @Get('/cid')
          getAllcid() {
            return this.cidService.findAllCid();
          }


          //BUSCAR UMA UNIDADE DE SAUDE
          @Get('/:id')
          async getUnidSaude(@Param('id') id: number) {
            return this.unidSaudeService.findOneUnid(id);
          }
        
          //CADASTRO DE UNID-SAUDE
          @Post()
          createunidSaude(@Body() createUnidSaudeDto: CreateUnidSaudeDto) {
            createUnidSaudeDto.createdAt= new Date();
            createUnidSaudeDto.updatedAt = new Date();
            return this.unidSaudeService.createUnid(createUnidSaudeDto);
          }
        
          //ATUALIZAÇAO DE UNID-SAUDE
          @Put(':id')
          update(@Param('id') id: number, @Body() updateUnidSaudeDto) {
            return this.unidSaudeService.updateUnid(id, updateUnidSaudeDto);
          }

          //APAGA A UNIDADE DE SAUDE
          @Delete('/:id')
          async deleteById(@Param('id', ParseIntPipe) id: number) {
            await this.unidSaudeService.removeUnid(id);
          }
         
          //VAI TRAZER OS PACIENTES DE ACORDO COM A UNID-SAUDE
           @Get(':unidsaudeId/paciente')
            async getPacientesPorUnidSaude(@Param('unidsaudeId') unidsaudeId: number) {
              return this.pacienteService.getOnePaciente(unidsaudeId);
            }

          //CADASTRO DE PACIENTE DE ACORDO COM A UNID-SAUDE
          @Post(':id/paciente')
          createUnidPaciente(
            @Param('id', ParseIntPipe) id: number,
            @Body() createrPacienteDto: CreatePacienteDto,) {
              createrPacienteDto.createdAt= new Date();
              createrPacienteDto.updatedAt = new Date();
              createrPacienteDto.unidsaudeid = id;
           return this.pacienteService.createPaciente(createrPacienteDto);
          }

          //ATUALIZAÇAO DE PACIENTE
          @Put('/paciente/:id')
          updateUni(@Param('id') id: number, @Body() updateUnidSaudeDto) {
            return this.pacienteService.updatePaciente(id, updateUnidSaudeDto);
          }

          //APAGAR PACIENTE
          @Delete('/paciente/:id')
          async deletePacienteById(@Param('id', ParseIntPipe) id: number) {
            await this.pacienteService.removePaciente(id);
          }

         
          @Get('/atendimento')
          async getAtendimentosWithInnerJoin() {
            return this.atendimentoService.findAtendimentosWithPacienteAndCid();
          }

           //CADASTRO DE ATENDIMENTO
          @Post('/atendimento')
          async createAtendimento(
            @Body() createAtendimentoDto: CreateAtendimentoDto,) {
              createAtendimentoDto.createdAt= new Date();
              createAtendimentoDto.updatedAt = new Date();
            
            try {
              const result = await this.atendimentoService.createAtendimento(createAtendimentoDto);
            } catch (error) {
              if (error instanceof NotFoundException) {
                throw new NotFoundException(error.message);
              }
              throw error;
            }
          
        }
}
