import { Controller, Get, Param, Query, UseGuards } from "@nestjs/common";
import { HospitalService } from "./hospital.service";
import { AuthGuard } from "src/auth/auth.guard";
import { SkipThrottle, ThrottlerGuard } from "@nestjs/throttler";
import { AuthApiKeyGuard } from "src/auth/apiKey.guard";

@Controller("hospitals")
export class HospitalController {
  constructor(private readonly hospitalService: HospitalService) { }

  @UseGuards(AuthGuard, ThrottlerGuard)
  @Get()
  async getHospitalDetails(@Query("name") name?: string) {
    if (name) {
      return this.hospitalService.searchHospitalsByName(name);
    } else {
      return this.hospitalService.getHospitalDetails();
    }
  }

  @UseGuards(AuthGuard, ThrottlerGuard)
  @SkipThrottle()
  @Get(":id")
  async getHospitalDetailsById(@Param("id") id: number) {
    return this.hospitalService.getHospitalDetailsById(id);
  }
  @UseGuards(AuthGuard, ThrottlerGuard)
  @SkipThrottle()
  @Get("appointment-history/:patient_id")
  async getHospitalAppointmentHistoryById(
    @Param("patient_id") patient_id: number,
    @Query("hospitalId") hospitalId: number
  ) {
    if (!patient_id || !hospitalId) {
      return {
        status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
        status: process.env.ERROR_STATUS_CODE,
        message: process.env.HOS_AND_PAT_ERR,
      };
    }
    const appointmentHistory =
      await this.hospitalService.getHospitalAppointmentHistoryById(
        patient_id,
        hospitalId
      );
    return appointmentHistory;
  }
  @UseGuards(AuthGuard, ThrottlerGuard)
  @SkipThrottle()
  @Get("/Hosdoctors/:id")
  async getHospitalDoctorsById(@Param("id") hospitalId: number) {
    const hospitalDoctors =
      await this.hospitalService.getHospitalDoctorsById(hospitalId);
    return hospitalDoctors;
  }


  @UseGuards(AuthGuard)
  @SkipThrottle()
  @Get("list/v2")
  async getHospitalDetailslist(
    @Query("limit") limit?: string,
    @Query("page") page?: string,
    @Query("search") search?: string
  ) {
    try {
      const res = await this.hospitalService.getHospitalDetailslist(
        +limit || 10,
        +page || 1,
        search || ""
      );
      if (res.details.length > 0) {
        return {
          status_code: process.env.SUCCESS_STATUS_CODE,
          status: process.env.SUCCESS_STATUS,
          message: process.env.SUCCESS_MESSAGE,
          data: res.details,
          total: res.total,
        };
      } else {
        return {
          status_code: process.env.SUCCESS_STATUS_CODE,
          status: process.env.SUCCESS_STATUS,
          message: process.env.DATA_NOT_FOUND,
        };
      }
    } catch (error) {
      return {
        status_code: process.env.ERROR_STATUS_CODE,
        status: process.env.ERROR_STATUS,
        message: process.env.ERROR_MESSAGE,
      };
    }
  }

  @UseGuards(AuthGuard, ThrottlerGuard)
  @SkipThrottle()
  @Get("v2/Hosdoctors")
  async getHospitalDoctorsByIdlist(
    @Query("id") hospitalId: number,
    @Query("limit") limit: string,
    @Query("page") page: string
  ) {
    try {
      if (!hospitalId) {
        return {
          status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
          status: process.env.ERROR_STATUS,
          message: process.env.HOSPITAL_ID_ERR,
        };
      }

      const hospitalDoctors =
        await this.hospitalService.getHospitalDoctorsByIdlist(
          hospitalId,
          +limit || 10,
          +page || 1
        );
      if (hospitalDoctors.details.length > 0) {
        return {
          status_code: process.env.SUCCESS_STATUS_CODE,
          status: process.env.SUCCESS_STATUS,
          message: process.env.SUCCESS_MESSAGE,
          data: hospitalDoctors.details,
          total: hospitalDoctors.total,
        };
      } else {
        return {
          status_code: process.env.SUCCESS_STATUS_CODE,
          status: process.env.SUCCESS_STATUS,
          message: process.env.DATA_NOT_FOUND,
        };
      }
    } catch (error) {
      return {
        status_code: process.env.ERROR_STATUS_CODE,
        status: process.env.ERROR_STATUS,
        message: process.env.ERROR_MESSAGE,
      };
    }
  }

  @UseGuards(AuthGuard, ThrottlerGuard)
  @SkipThrottle()
  @Get("v2/appointment-history/:patient_id")
  async getHospitalAppointmentHistoryByIdlist(
    @Param("patient_id") patient_id: number,
    @Query("hospitalId") hospitalId: number,
    @Query("limit") limit: string,
    @Query("page") page: string
  ) {
    if (!patient_id || !hospitalId) {
      return {
        status_code: process.env.ERROR_STATUS_CODE_PARAMS_MISSING,
        status: process.env.ERROR_STATUS,
        message: process.env.HOS_AND_PAT_ERR,
      };
    }
    const appointmentHistory =
      await this.hospitalService.getHospitalAppointmentHistoryByIdlist(
        patient_id,
        hospitalId,
        +limit || 10,
        +page || 1
      );
    return appointmentHistory;
  }

  // @UseGuards(AuthApiKeyGuard)
  // @SkipThrottle()
  @Get("get-hospital-names/all")
  async getHospitalNames() {
    return this.hospitalService.getHospitalNames();
  }
}
