// types/simrs-roles.ts

interface Roles {
    nama_role: string;
    deskripsi: string;
    tanggung_jawab: string[];
  }
  
  interface KonfigurasiKeamanan {
    autentikasi: string;
    enkripsi: string;
    audit_trail: boolean;
    session_timeout: number;
  }
  
  interface KonfigurasiSistem {
    level_akses: string[];
    modul_utama: string[];
    keamanan: KonfigurasiKeamanan;
  }
  
  interface SIMRSRoles {
    role_administratif: Roles[];
    role_klinis: Roles[];
    role_penunjang_medis: Roles[];
    role_manajemen: Roles[];
    role_teknis: Roles[];
    konfigurasi_sistem: KonfigurasiSistem;
  }
  
  // Enum untuk level akses
  enum LevelAkses {
    SUPER_ADMIN = "Super Admin",
    ADMIN_DEPARTEMEN = "Admin Departemen", 
    USER_KLINIS = "User Klinis",
    USER_ADMINISTRATIF = "User Administratif",
    GUEST_READ_ONLY = "Guest/Read Only"
  }
  
  // Enum untuk modul utama
  enum ModulUtama {
    PENDAFTARAN_PASIEN = "Pendaftaran Pasien",
    REKAM_MEDIS_ELEKTRONIK = "Rekam Medis Elektronik",
    FARMASI = "Farmasi",
    LABORATORIUM = "Laboratorium",
    RADIOLOGI = "Radiologi",
    KEUANGAN = "Keuangan",
    INVENTORY = "Inventory",
    REPORTING = "Reporting"
  }
  
  // Data konstanta untuk SIMRS roles
  const simrsRoles: SIMRSRoles = {
    role_administratif: [
      {
        nama_role: "Administrator Pendaftaran",
        deskripsi: "Mengelola proses pendaftaran pasien dan penjadwalan dalam sistem SIMRS",
        tanggung_jawab: [
          "Mengelola pendaftaran pasien dan penjadwalan dokter",
          "Mengatur penjadwalan operasi atau pemeriksaan",
          "Mengelola antrian dan mengurangi waktu tunggu pasien",
          "Memastikan data pasien terinput dengan benar"
        ]
      },
      {
        nama_role: "Staff Administrasi Keuangan",
        deskripsi: "Mengelola aspek keuangan dan penagihan dalam sistem rumah sakit",
        tanggung_jawab: [
          "Mengelola penagihan dan klaim asuransi",
          "Mengintegrasikan sistem dengan BPJS Kesehatan",
          "Mengelola administrasi keuangan rumah sakit",
          "Memproses pembayaran dan verifikasi biaya"
        ]
      },
      {
        nama_role: "Petugas Rekam Medis",
        deskripsi: "Mengelola dan memelihara rekam medis elektronik pasien",
        tanggung_jawab: [
          "Mengelola Electronic Medical Records (EMR)",
          "Memastikan dokumentasi pasien yang akurat",
          "Menjaga keamanan dan kerahasiaan data pasien",
          "Melakukan backup dan archiving data medis"
        ]
      }
    ],
    role_klinis: [
      {
        nama_role: "Dokter/Tenaga Medis",
        deskripsi: "Profesional medis yang menggunakan sistem untuk diagnosis dan pengobatan",
        tanggung_jawab: [
          "Mengakses riwayat medis, alergi, dan catatan pengobatan pasien",
          "Menggunakan modul pendukung pengambilan keputusan klinis",
          "Melakukan pemantauan pasien secara berkelanjutan",
          "Menginput diagnosis dan resep obat ke sistem"
        ]
      },
      {
        nama_role: "Perawat",
        deskripsi: "Tenaga keperawatan yang melakukan perawatan langsung kepada pasien",
        tanggung_jawab: [
          "Mencatat parameter vital dan perkembangan pasien",
          "Mengakses informasi terintegrasi dari berbagai departemen",
          "Melakukan pemantauan pasien rawat inap",
          "Mengelola jadwal pemberian obat dan tindakan keperawatan"
        ]
      },
      {
        nama_role: "Apoteker/Staff Farmasi",
        deskripsi: "Mengelola obat-obatan dan memastikan keamanan farmasi",
        tanggung_jawab: [
          "Mengelola persediaan obat dan bahan medis",
          "Memastikan ketersediaan obat yang sesuai",
          "Mencegah risiko kekurangan atau kelebihan stok",
          "Melakukan verifikasi resep dan dispensing obat"
        ]
      }
    ],
    role_penunjang_medis: [
      {
        nama_role: "Petugas Laboratorium",
        deskripsi: "Mengelola pemeriksaan laboratorium dan hasilnya",
        tanggung_jawab: [
          "Menginput hasil tes laboratorium ke sistem",
          "Mengintegrasikan data laboratorium dengan rekam medis",
          "Melakukan quality control hasil laboratorium",
          "Mengelola sampel dan alat laboratorium"
        ]
      },
      {
        nama_role: "Petugas Radiologi",
        deskripsi: "Mengelola pemeriksaan radiologi dan imaging",
        tanggung_jawab: [
          "Mengelola hasil pemeriksaan radiologi",
          "Mengintegrasikan data radiologi dengan sistem",
          "Melakukan penjadwalan pemeriksaan radiologi",
          "Memastikan kualitas gambar dan interpretasi"
        ]
      }
    ],
    role_manajemen: [
      {
        nama_role: "Manajer Rumah Sakit",
        deskripsi: "Mengelola operasional rumah sakit secara keseluruhan",
        tanggung_jawab: [
          "Mengakses laporan dan analisis kinerja",
          "Melakukan monitoring operasional rumah sakit",
          "Menggunakan modul prediktif untuk perencanaan sumber daya",
          "Membuat keputusan strategis berdasarkan data sistem"
        ]
      },
      {
        nama_role: "Supervisor Departemen",
        deskripsi: "Mengawasi dan mengoordinasikan departemen spesifik",
        tanggung_jawab: [
          "Mengelola koordinasi antar-departemen",
          "Memastikan integrasi berbagai aspek operasional",
          "Monitoring kinerja staff departemen",
          "Melakukan evaluasi dan pelaporan departemen"
        ]
      }
    ],
    role_teknis: [
      {
        nama_role: "Administrator Sistem SIMRS",
        deskripsi: "Mengelola infrastruktur dan keamanan sistem SIMRS",
        tanggung_jawab: [
          "Mengelola keamanan sistem dan data terenkripsi",
          "Melakukan maintenance dan troubleshooting sistem",
          "Menangani masalah infrastruktur teknologi",
          "Mengatur hak akses user dan permission"
        ]
      },
      {
        nama_role: "Staff IT Support",
        deskripsi: "Memberikan dukungan teknis kepada pengguna sistem",
        tanggung_jawab: [
          "Memberikan pelatihan teknologi kepada pengguna",
          "Menangani masalah teknis harian",
          "Melakukan monitoring sistem dan evaluasi",
          "Membantu troubleshooting masalah user"
        ]
      }
    ],
    konfigurasi_sistem: {
      level_akses: [
        LevelAkses.SUPER_ADMIN,
        LevelAkses.ADMIN_DEPARTEMEN,
        LevelAkses.USER_KLINIS,
        LevelAkses.USER_ADMINISTRATIF,
        LevelAkses.GUEST_READ_ONLY
      ],
      modul_utama: [
        ModulUtama.PENDAFTARAN_PASIEN,
        ModulUtama.REKAM_MEDIS_ELEKTRONIK,
        ModulUtama.FARMASI,
        ModulUtama.LABORATORIUM,
        ModulUtama.RADIOLOGI,
        ModulUtama.KEUANGAN,
        ModulUtama.INVENTORY,
        ModulUtama.REPORTING
      ],
      keamanan: {
        autentikasi: "Multi-factor Authentication",
        enkripsi: "AES-256",
        audit_trail: true,
        session_timeout: 30
      }
    }
  };
  
  // Utility functions
  class SIMRSRoleManager {
    private roles: SIMRSRoles;
  
    constructor(roles: SIMRSRoles) {
      this.roles = roles;
    }
  
    // Mendapatkan semua role berdasarkan kategori
    getRolesByCategory(category: keyof Omit<SIMRSRoles, 'konfigurasi_sistem'>): Roles[] {
      return this.roles[category];
    }
  
    // Mencari role berdasarkan nama
    findRoleByName(name: string): Roles | undefined {
      const allCategories = [
        ...this.roles.role_administratif,
        ...this.roles.role_klinis,
        ...this.roles.role_penunjang_medis,
        ...this.roles.role_manajemen,
        ...this.roles.role_teknis
      ];
      
      return allCategories.find(role => role.nama_role === name);
    }
  
    // Mendapatkan konfigurasi keamanan
    getSecurityConfig(): KonfigurasiKeamanan {
      return this.roles.konfigurasi_sistem.keamanan;
    }
  
    // Mendapatkan semua level akses
    getAccessLevels(): string[] {
      return this.roles.konfigurasi_sistem.level_akses;
    }
  }
  
export type {
  Roles,
  KonfigurasiKeamanan,
  KonfigurasiSistem,
  SIMRSRoles,
};

export {
  LevelAkses,
  ModulUtama,
  SIMRSRoleManager,
  simrsRoles as default,
};
  
  // Contoh penggunaan
  export const roleManager = new SIMRSRoleManager(simrsRoles);
  