import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { Sequelize } from 'sequelize-typescript';
import { CreatePacienteDto } from 'src/unid-saude/dtos/createPacienteDto.dto';
import { Paciente } from 'src/unid-saude/entity/paciente.unid-saude.model';
import { UnidSaude } from 'src/unid-saude/entity/unid-saude.model';

@Injectable()
export class PacienteService {
    constructor(
        private sequelize: Sequelize,
        @InjectModel(Paciente)
        private pacienteModel: typeof Paciente,
        @InjectModel(UnidSaude)
        private unidSaudeModel: typeof UnidSaude,
    ) {}

    async findAllPaciente(): Promise<Paciente[]> {
      return this.pacienteModel.findAll();
    }

    async findOneById(id: number): Promise<Paciente | null> {
      return this.pacienteModel.findOne({
        where: { id },
      });
    }
  
  

    async getOnePaciente(unidsaudeId: number): Promise<Paciente[]> {
      return this.pacienteModel.findAll({
        where: {
          unidsaudeId,
        },
      });
    }
        
async createPaciente(
    createPacienteDetails: CreatePacienteDto,
    ): Promise<Paciente> {
    const paciente = await this.unidSaudeModel.findOne({
      where: {id: createPacienteDetails.unidsaudeid}});
    if (!paciente)
      throw new HttpException(
        'Unidade de saude não encontrada. Não é possivel cadastrar um paciente',
        HttpStatus.BAD_REQUEST,
      );
    const newPaciente = this.pacienteModel.create({
      ...createPacienteDetails
    });
    return newPaciente;
  }

  async updatePaciente(id: number, paciente: Paciente): Promise<[string, Paciente[]]> {
    const [affectedCount, updatedPaciente] = await this.pacienteModel.update(paciente, { where: { id }, returning: true });
  
    if (affectedCount > 0) {
      return ['success', updatedPaciente];
    }
  }

  async removePaciente(id: number): Promise<void> {
    const paciente = await this.pacienteModel.findByPk(id);

    if (paciente) {
      await paciente.destroy();
    }
  }

}
