import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { RolesModule } from "./roles/roles.module";
import { ConfigModule } from "@nestjs/config";
import { TypeOrmModule } from "@nestjs/typeorm";
import { LoginModule } from "./login/login.module";
import { DynamicDatabaseService } from "./dynamic_db.service";
import { AppointmentModule } from "./appointment/appointment.module";
import { InternalAppntDoctorsModule } from "./internal-appnt-doctors/internal-appnt-doctors.module";
import { AppointmentStatusModule } from "./appointment_status/appointment_status.module";
import { VerifyTokenModule } from "./verify-token/verify-token.module";
import { EmrModule } from "./emr/emr.module";
import { PatientFromQrModule } from "./patient_from_qr/patient_from_qr.module";
import { DoctorsModule } from "./doctors/doctors.module";
import { DoctorSlotShiftModule } from "./doctor_slot_shift/doctor_slot_shift.module";
import { DocumentTypeModule } from "./document-type/document-type.module";
import { PrescriptionModule } from "./prescription/prescription.module";
import { VitalsModule } from "./vitals/vitals.module";
import { ClinicalNotesModule } from "./clinical-notes/clinical-notes.module";
import { BloodGroupModule } from "./blood-group/blood-group.module";
import { UsermaritalstatusModule } from "./Op-hub-maritalstatus/user-maritalstatus.module";
import { UsergenderModule } from "./Op-hub-gender/hub_gender.module";
import { PatientprofileModule } from "./patient-profile/patient-profile.module";
import { CheckOldPatientModule } from "./check-old-patient/check-old-patient.module";
import { ConsultationstatusModule } from "./consultation_process/consultation.module";
import { PatientSalutationModule } from "./patient-salutation/patient-salutation.module";
import { CountryCodeModule } from "./country-code/country-code.module";
import { PaymentStatusModule } from "./payment-status/payment-status.module";
import { CompleteAndCloseConsultationModule } from "./complete-and-close-consultation/complete-and-close-consultation.module";
import { AppointmentCancellationReasonModule } from "./appointment-cancellation-reason/appointment-cancellation-reason.module";
import { PatientAppointmentListModule } from "./patient-appointment-list/patient-appointment-list.module";
import { BillingModule } from "./billing/billing.module";
import { ClinicalNotesWithAbhaModule } from "./clinical-notes-with-abha/clinical-notes-with-abha.module";
import { OpdPrescriptionModule } from "./opd-prescription/opd-prescription.module";
import { ChiefComplaintsListModule } from "./chief_complaints_list/chief_complaints_list.module";
import { DiagnosisCategoryListModule } from "./diagnosis-category-list/diagnosis-category-list.module";
import { DiagnosisSubCategoryListModule } from "./diagnosis-sub-category-list/diagnosis-sub-category-list.module";
import { PreviewDocModule } from "./preview_doc/preview_doc.module";
import { ManualVitalsModule } from "./manual_vitals/manual_vitals.module";
import { UploadDocPreviwModule } from "./upload-doc-previw/upload-doc-previw.module";
import { VoiceTextSarvamModule } from "./voice-text-sarvam/voice-text-sarvam.module";
import { OverallHeaderSearchModule } from "./overall-header-search/overall-header-search.module";
import { GetPatDetailsByAayushUniqueIdModule } from "./get-pat-details-by-aayush-unique-id/get-pat-details-by-aayush-unique-id.module";
import { GetAbhaAddressOfPatientModule } from "./get-abha-address-of-patient/get-abha-address-of-patient.module";
import { CheckForDuplicateAppointmentModule } from "./check-for-duplicate-appointment/check-for-duplicate-appointment.module";
import { VitalsVibrasenseModule } from "./vitals-vibrasense/vitals-vibrasense.module";
import { OpHubFcmTokenModule } from "./op-hub-fcm-token/op-hub-fcm-token.module";
import { GoogleauthModule } from "./googleauth/googleauth.module";
import { SendNotificationModule } from "./send-notification/send-notification.module";
import { UnlinkAbhaFromPatientModule } from "./unlink-abha-from-patient/unlink-abha-from-patient.module";
import { SttTranslateSarvamModule } from "./stt-translate-sarvam/stt-translate-sarvam.module";
import { AuthGuard } from "./auth/auth.guard";
import { BankListModule } from "./bank-list/bank-list.module";
import { QrEncrpytModule } from "./qr-encrpyt/qr-encrpyt.module";
import { BhasiniModule } from './bhasini/bhasini.module';
import { OpHubNewBillingModule } from './op-hub-new-billing/op-hub-new-billing.module';
import { BundleGenerationModule } from './bundle-generation/bundle-generation.module';
import { OpHubPackagesModule } from './op-hub-packages/op-hub-packages.module';
import { ThrottlerModule } from '@nestjs/throttler';
import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from "@nestjs/core";
import { CustomThrottlerGuard } from "./throttler/custom-throttler.guard";
import { makeCounterProvider, makeGaugeProvider, makeHistogramProvider, PrometheusModule } from "@willsoto/nestjs-prometheus";
import { HttpMetricsInterceptor } from "./http-metrics.interceptor";
import { MetricsService } from "./metrics.service";
import { MetricsBootstrap } from "./metrics.bootstrap";
import { MetricsExceptionFilter } from "./metrics-exception.filter";
import { DbMetricsService } from "./db-metrics.service";
import { DbMetricsUpdater } from "./db-metrics.updater";
import { TypeOrmMetricsLogger } from "./typeorm-metrics.logger";
import { PharmacyModule } from './pharmacy/pharmacy.module';

@Module({
  imports: [
    ConfigModule.forRoot(),
    ThrottlerModule.forRoot(),
    PrometheusModule.register({
      path: '/metrics',
      defaultMetrics: {
        enabled: true,
      },
    }),
    TypeOrmModule.forRoot({
      type: process.env.ADMIN_TYPE as "mysql",
      host: process.env.ADMIN_HOST_NAME,
      port: parseInt(process.env.ADMIN_PORT),
      username: process.env.ADMIN_USERNAME,
      password: process.env.ADMIN_PASSWORD,
      database: process.env.ADMIN_DB_NAME,
      entities: ["dist/**/*.entity{.ts,.js}"],
      synchronize: false,
      logging: false,

      logger: new TypeOrmMetricsLogger('HUB'),
      maxQueryExecutionTime: 500,
      extra: {
        connectionLimit: 10,
      },
    }),
    RolesModule,
    LoginModule,
    AppointmentModule,
    InternalAppntDoctorsModule,
    AppointmentStatusModule,
    VerifyTokenModule,
    EmrModule,
    PatientFromQrModule,
    DoctorsModule,
    DoctorSlotShiftModule,
    DocumentTypeModule,
    PrescriptionModule,
    VitalsModule,
    ClinicalNotesModule,
    BloodGroupModule,
    UsermaritalstatusModule,
    UsergenderModule,
    PatientprofileModule,
    CheckOldPatientModule,
    ConsultationstatusModule,
    PatientSalutationModule,
    CountryCodeModule,
    PaymentStatusModule,
    CompleteAndCloseConsultationModule,
    AppointmentCancellationReasonModule,
    PatientAppointmentListModule,
    BillingModule,
    ClinicalNotesWithAbhaModule,
    OpdPrescriptionModule,
    ChiefComplaintsListModule,
    DiagnosisCategoryListModule,
    DiagnosisSubCategoryListModule,
    PreviewDocModule,
    ManualVitalsModule,
    UploadDocPreviwModule,
    VoiceTextSarvamModule,
    OverallHeaderSearchModule,
    GetPatDetailsByAayushUniqueIdModule,
    GetAbhaAddressOfPatientModule,
    CheckForDuplicateAppointmentModule,
    VitalsVibrasenseModule,
    OpHubFcmTokenModule,
    GoogleauthModule,
    SendNotificationModule,
    UnlinkAbhaFromPatientModule,
    SttTranslateSarvamModule,
    BankListModule,
    QrEncrpytModule,
    BhasiniModule,
    OpHubNewBillingModule,
    BundleGenerationModule,
    OpHubPackagesModule,
    PharmacyModule,
  ],
  controllers: [AppController],
  providers: [AppService, DynamicDatabaseService, AuthGuard, {
    provide: APP_GUARD,
    useClass: CustomThrottlerGuard,
  },
    makeCounterProvider({
      name: 'http_requests_total',
      help: 'Total HTTP requests',
      labelNames: ['job', 'method', 'route', 'status'],
    }),
    makeHistogramProvider({
      name: 'http_request_duration_seconds',
      help: 'HTTP request latency',
      labelNames: ['job', 'method', 'route'],
      buckets: [0.1, 0.3, 0.5, 1, 1.5, 2, 5],
    }),
    makeGaugeProvider({
      name: 'http_active_requests',
      help: 'Active HTTP requests',
      labelNames: ['job'],

    }),

    makeGaugeProvider({
      name: 'app_info',
      help: 'Application build and version information',
      labelNames: ['job', 'version', 'build_time'],
    }),
    makeCounterProvider({
      name: 'service_restart_total',
      help: 'Total number of service restarts',
      labelNames: ['job'],
    }),
    makeCounterProvider({
      name: 'app_exceptions_total',
      help: 'Total unhandled application exceptions',
      labelNames: ['job', 'type'],
    }), makeGaugeProvider({
      name: 'db_active_connections',
      help: 'Number of active DB connections',
      labelNames: ['job'],
    }),
    makeGaugeProvider({
      name: 'db_idle_connections',
      help: 'Number of idle DB connections',
      labelNames: ['job'],
    }),
    makeCounterProvider({
      name: 'db_query_total',
      help: 'Total number of DB queries executed',
      labelNames: ['job', 'db'],
    }),
    makeCounterProvider({
      name: 'db_query_failed_total',
      help: 'Total number of failed DB queries',
      labelNames: ['job', 'db'],
    }),
    makeHistogramProvider({
      name: 'db_query_duration_seconds',
      help: 'Database query execution time',
      labelNames: ['job', 'db', 'operation'],
      buckets: [0.01, 0.05, 0.1, 0.3, 0.5, 1, 2, 5],
    }),
    DbMetricsService,
    MetricsService,
    MetricsBootstrap,
    DbMetricsUpdater,

    // ✅ Register interceptor globally
    {
      provide: APP_INTERCEPTOR,
      useClass: HttpMetricsInterceptor,
    }, {
      provide: APP_FILTER,
      useClass: MetricsExceptionFilter,
    },
  ],
})
export class AppModule {
  constructor() { }
}
