package models

import "time"

// Tarif Models - Data struktur buat tarif dari berbagai sumber

type TarifBPJSRawatInap struct {
	KodeINA   string  `gorm:"column:ID_INACBG_RI"`
	Deskripsi string  `gorm:"column:Tindakan_RI"`
	Kelas1    float64 `gorm:"column:Tarif_Kelas_1"`
	Kelas2    float64 `gorm:"column:Tarif_Kelas_2"`
	Kelas3    float64 `gorm:"column:Tarif_Kelas_3"`
}

type TarifBPJSRawatJalan struct {
	KodeINA     string  `gorm:"column:ID_INACBG_RJ"`
	Deskripsi   string  `gorm:"column:Tindakan_RJ"`
	TarifINACBG float64 `gorm:"column:Tarif_RJ" json:"tarif_inacbg"`
}

type TarifRS struct {
	KodeRS    string `gorm:"column:ID_Tarif_RS"`
	Deskripsi string `gorm:"column:Tindakan_RS"`
	Harga     int    `gorm:"column:Tarif_RS"`
	Kategori  string `gorm:"column:Kategori_RS"`
}

func (TarifBPJSRawatJalan) TableName() string {
	return "ina_cbg_rawatjalan"
}

func (TarifBPJSRawatInap) TableName() string {
	return "ina_cbg_rawatinap"
}

func (TarifRS) TableName() string {
	return "tarif_rs"
}

// billing_inacbg_RI
type Billing_INACBG_RI struct {
	ID_Billing  int    `gorm:"column:ID_Billing"`
	Kode_INACBG string `gorm:"column:ID_INACBG_RI"`
}

func (Billing_INACBG_RI) TableName() string {
	return "billing_inacbg_ri"
}

// billing_inacbg_RJ
type Billing_INACBG_RJ struct {
	ID_Billing  int    `gorm:"column:ID_Billing"`
	Kode_INACBG string `gorm:"column:ID_INACBG_RJ"`
}

func (Billing_INACBG_RJ) TableName() string {
	return "billing_inacbg_rj"
}

type Billing_DPJP struct {
	ID_Billing int `gorm:"column:ID_Billing;primaryKey"`
	ID_DPJP    int `gorm:"column:ID_DPJP;primaryKey"`
}

func (Billing_DPJP) TableName() string {
	return "billing_dpjp"
}

// ICD9

type ICD9 struct {
	Kode_ICD9 string `gorm:"column:ID_ICD9"`
	Prosedur  string `gorm:"column:Prosedur"`
	Versi     string `gorm:"column:Versi_ICD9"`
}

func (ICD9) TableName() string {
	return "icd9"
}

// ICD10
type ICD10 struct {
	Kode_ICD10 string `gorm:"column:ID_ICD10"`
	Diagnosa   string `gorm:"column:Diagnosa"`
	Versi      string `gorm:"column:Versi_ICD10"`
}

func (ICD10) TableName() string {
	return "icd10"
}

// ruangan
type Ruangan struct {
	ID_Ruangan       string `gorm:"column:ID_Ruangan"`
	Jenis_Ruangan    string `gorm:"column:Jenis_Ruangan"`
	Nama_Ruangan     string `gorm:"column:Nama_Ruangan"`
	Keterangan       string `gorm:"column:keterangan"`
	Kategori_ruangan string `gorm:"column:kategori_ruangan"`
}

func (Ruangan) TableName() string {
	return "ruangan"
}

// dokter
type Dokter struct {
	ID_Dokter     int    `gorm:"column:ID_Dokter;primaryKey"`
	Nama_Dokter   string `gorm:"column:Nama_Dokter"`
	Password      string `gorm:"column:Password"`
	Status        string `gorm:"column:Status"`
	KSM           string `gorm:"column:KSM"`
	Email_UB      string `gorm:"column:Email_UB"`
	Email_Pribadi string `gorm:"column:Email_Pribadi"`
}

func (Dokter) TableName() string {
	return "dokter"
}

// PASIEN
type Pasien struct {
	ID_Pasien     int    `gorm:"column:ID_Pasien;primaryKey;autoIncrement"`
	Nama_Pasien   string `gorm:"column:Nama_Pasien"`
	Jenis_Kelamin string `gorm:"column:Jenis_Kelamin"`
	Usia          int    `gorm:"column:Usia"`
	Ruangan       string `gorm:"column:Ruangan"`
	Kelas         string `gorm:"column:Kelas"`
}

type Kelas string

const (
	Kelas_1 Kelas = "1"
	Kelas_2 Kelas = "2"
	Kelas_3 Kelas = "3"
)

type Jenis_kelamin string

const (
	Jenis_Kelamin_Laki_laki Jenis_kelamin = "Laki-laki"
	Jenis_Kelamin_Perempuan Jenis_kelamin = "Perempuan"
)

func (Pasien) TableName() string {
	return "pasien"
}

// login dokter
type LoginRequest struct {
	Email    string `json:"email" binding:"required,email"`
	Password string `json:"password" binding:"required"`
}

//edit inacbg admin

type Edit_INACBG_Request struct {
	ID_Billing   int      `json:"id_billing"`
	Tipe_inacbg  string   `json:"tipe_inacbg"`
	Kode_inacbg  []string `json:"kode_inacbg"`
	Kode_Delete  []string `json:"kode_delete"`
	Total_Klaim  float64  `json:"total_klaim"`
	Billing_Sign string   `json:"billing_sign"`
}

//close billing

type Close_billing struct {
	ID_Billing     int    `json:"id_billing"`
	Tanggal_Keluar string `json:"tanggal_keluar"`
}

//riwayat billing pasien

type Riwayat_Pasien_all struct {
	ID_Billing       int        `json:"id_billing"`
	ID_Pasien        int        `json:"id_pasien"`
	Nama_Pasien      string     `json:"nama_pasien"`
	Jenis_Kelamin    string     `json:"jenis_kelamin"`
	Usia             int        `json:"usia"`
	Ruangan          string     `json:"ruangan"`
	Nama_Ruangan     string     `json:"nama_ruangan"` // ← Added: Ruangan name for display
	Kelas            string     `json:"kelas"`
	ID_DPJP          int        `json:"id_dpjp"` // ← Added: Doctor in charge
	Nama_DPJP        string     `json:"nama_dpjp"`
	Tanggal_Keluar   string     `json:"tanggal_keluar"`
	Tanggal_Masuk    string     `json:"tanggal_masuk"` // Tanggal_Masuk    *time.Time `json:"tanggal_masuk"`
	Tanggal_Tindakan *time.Time `json:"tanggal_tindakan"`
	Tindakan_RS      []string   `json:"tindakan_rs"`
	ICD9             []string   `json:"icd9"`
	ICD10            []string   `json:"icd10"`
	Kode_INACBG      string     `json:"kode_inacbg"`
	Total_Tarif_RS   float64    `json:"total_tarif_rs"` // ← Added: Hospital tariff
	Total_Klaim      float64    `json:"total_klaim"`    // ← Added: BPJS claim
}

//billing pasien

type BillingPasien struct {
	ID_Billing     int        `gorm:"column:ID_Billing;primaryKey;autoIncrement" json:"id_billing"`
	ID_Pasien      int        `gorm:"column:ID_Pasien" json:"id_pasien"`
	Cara_Bayar     string     `gorm:"column:Cara_Bayar" json:"cara_bayar"`
	Tanggal_masuk  *time.Time `gorm:"column:Tanggal_Masuk" json:"tanggal_masuk"`
	Tanggal_keluar *time.Time `gorm:"column:Tanggal_Keluar" json:"tanggal_keluar"`
	Total_Tarif_RS float64    `gorm:"column:Total_Tarif_RS" json:"total_tarif_rs"`
	Total_Klaim    float64    `gorm:"column:Total_Klaim" json:"total_klaim"`
	Billing_sign   string     `gorm:"column:Billing_Sign" json:"billing_sign"`
}

type Cara_bayar string

const (
	Cara_Bayar_BPJS Cara_bayar = "BPJS"
	Cara_Bayar_UMUM Cara_bayar = "UMUM"
)

func (BillingPasien) TableName() string {
	return "billing_pasien"
}

// BillingRequest untuk menerima data dari frontend
type BillingRequest struct {
	Nama_Dokter      []string `json:"nama_dokter" binding:"required"` // Array untuk multiple doctors
	Nama_Pasien      string   `json:"nama_pasien" binding:"required"`
	Jenis_Kelamin    string   `json:"jenis_kelamin" binding:"required"`
	Usia             int      `json:"usia" binding:"required"`
	ID_DPJP          int      `json:"id_dpjp"`
	Ruangan          string   `json:"ruangan" binding:"required"`
	Kelas            string   `json:"kelas" binding:"required"`
	Tindakan_RS      []string `json:"tindakan_rs" binding:"required"`
	Tanggal_Keluar   string   `json:"tanggal_keluar"`
	Billing_sign     string   `json:"billing_sign"`
	ICD9             []string `json:"icd9"`
	ICD10            []string `json:"icd10" binding:"required"`
	Cara_Bayar       string   `json:"cara_bayar" binding:"required"`
	Total_Tarif_RS   float64  `json:"total_tarif_rs"`
	Total_Klaim_BPJS float64  `json:"total_klaim_bpjs"` // ← Added: Baseline BPJS claim from FE
}

// admin ruangan //Admin_Ruangan

type Admin_Ruangan struct {
	ID_Admin   int    `gorm:"column:ID_Admin"`
	Nama_Admin string `gorm:"column:Nama_Admin"`
	Password   string `gorm:"column:Password"`
	ID_Ruangan string `gorm:"column:ID_Ruangan"`
}

func (Admin_Ruangan) TableName() string {
	return "admin_ruangan"
}

// billing_Tidakan

type Billing_Tindakan struct {
	ID_Billing       int        `gorm:"column:ID_Billing;primaryKey;not null"`
	ID_Tarif_RS      string     `gorm:"column:ID_Tarif_RS;primaryKey;not null"`
	Tanggal_Tindakan *time.Time `gorm:"column:tanggal_tindakan"`
}

func (Billing_Tindakan) TableName() string {
	return "billing_tindakan"
}

// billing_ICD9 dan ICD10

type Billing_ICD9 struct {
	ID_Billing int    `gorm:"column:ID_Billing;primaryKey;not null"`
	ID_ICD9    string `gorm:"column:ID_ICD9;primaryKey;not null"`
}

type Billing_ICD10 struct {
	ID_Billing int    `gorm:"column:ID_Billing;primaryKey;not null"`
	ID_ICD10   string `gorm:"column:ID_ICD10;primaryKey;not null"`
}

func (Billing_ICD9) TableName() string {
	return "billing_icd9"
}
func (Billing_ICD10) TableName() string {
	return "billing_icd10"
}

// billing_Dokter - relasi many-to-many antara billing dan dokter dengan tracking tanggal
type Billing_Dokter struct {
	ID_Billing int        `gorm:"column:ID_Billing"`
	ID_Dokter  int        `gorm:"column:ID_Dokter"`
	Tanggal    *time.Time `gorm:"column:tanggal"` // Tanggal kapan dokter menangani pasien
}

func (Billing_Dokter) TableName() string {
	return "billing_dokter"
}

// riwayat pasien
type Riwayat_Pasien struct {
	ID_Billing     int      `json:"id_billing"`
	Nama_pasien    string   `json:"nama_pasien"`
	ID_Pasien      int      `json:"id_pasien"`
	Kelas          string   `json:"Kelas"`
	Ruangan        string   `json:"ruangan"`
	Total_Tarif_RS float64  `json:"total_tarif_rs"`
	Total_Klaim    float64  `json:"total_klaim"`
	Tindakan_RS    []string `json:"tindakan_rs"`
	ICD9           []string `json:"icd9"`
	ICD10          []string `json:"icd10"`
	INACBG_RI      []string `json:"inacbg_ri"`
	INACBG_RJ      []string `json:"inacbg_rj"`
	Billing_sign   string   `json:"billing_sign"`
	Nama_Dokter    []string `json:"nama_dokter"`
}

// Request untuk tampilan data Admin ( pengisian inacbg)
type Request_Admin_Inacbg struct {
	ID_Billing     int      `json:"id_billing"`
	Nama_pasien    string   `json:"nama_pasien"`
	ID_Pasien      int      `json:"id_pasien"`
	Kelas          string   `json:"Kelas"`
	Ruangan        string   `json:"ruangan"`
	Total_Tarif_RS float64  `json:"total_tarif_rs"`
	Total_Klaim    float64  `json:"total_klaim"`
	ID_DPJP        int      `json:"id_dpjp"`
	Tindakan_RS    []string `json:"tindakan_rs"`
	ICD9           []string `json:"icd9"`
	ICD10          []string `json:"icd10"`
	INACBG_RI      []string `json:"inacbg_ri"`
	INACBG_RJ      []string `json:"inacbg_rj"`
	Billing_sign   string   `json:"billing_sign"`
	Nama_Dokter    []string `json:"nama_dokter"`
}

// post ke data base
type Post_INACBG_Admin struct {
	ID_Billing     int      `json:"id_billing"`
	Tipe_inacbg    string   `json:"tipe_inacbg"`
	Kode_INACBG    []string `json:"kode_inacbg"`
	Total_klaim    float64  `json:"total_klaim"`
	Billing_sign   string   `json:"billing_sign"`
	Tanggal_keluar string   `json:"tanggal_keluar"` // Diisi oleh admin billing
}

// login dokter
type loginRequest struct {
	Email    string `json:"email" binding:"required,email"`
	Password string `json:"password" binding:"required"`
}

func (loginRequest) TableName() string {
	return "dokter"
}

// getpasienwithallicd9andicd10,andtindakanrs
