package vclaimsep

import (
	"encoding/json"
	ecore "simrs-vx/internal/domain/base-entities/core"
	evsh "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist"
)

type CreateDto struct {
	Encounter_Id   *uint   `json:"encounter_id"`
	Number         *string `json:"number" validate:"maxLength=19"`
	RequestPayload string  `json:"requestPayload" validate:"maxLength=1024"`

	VclaimSepHist evsh.CreateDto
}

type ReadListDto struct {
	FilterDto
	Includes   string `json:"includes"`
	Sort       string `json:"sort"`
	Pagination ecore.Pagination
}

type FilterDto struct {
	Number *string `json:"number"`
}

type ReadDetailDto struct {
	Id           uint    `json:"id"`
	Number       *string `json:"number"`
	Encounter_Id *uint   `json:"encounter_id"`
}

type UpdateDto struct {
	Id uint `json:"id"`
	CreateDto
}

type DeleteDto struct {
	Id     uint    `json:"id"`
	Number *string `json:"number"`
}

type MetaDto struct {
	PageNumber int `json:"page_number"`
	PageSize   int `json:"page_size"`
	Count      int `json:"count"`
}

type ResponseDto struct {
	ecore.Main
	Encounter_Id *uint      `json:"encounter_id"`
	Number       *string    `json:"number"`
	Detail       *SepDetail `json:"detail,omitempty"`
}

func (d VclaimSep) ToResponse() ResponseDto {
	resp := ResponseDto{
		Encounter_Id: d.Encounter_Id,
		Number:       d.Number,
		Detail:       d.Detail,
	}
	resp.Main = d.Main
	return resp
}

func ToResponseList(data []VclaimSep) []ResponseDto {
	resp := make([]ResponseDto, len(data))
	for i, u := range data {
		resp[i] = u.ToResponse()
	}
	return resp
}

func (c CreateDto) IsMessageSuccess() bool {
	return c.VclaimSepHist.Message == "Sukses"
}

func (c CreateDto) RequestPayloadIntoJson() ([]byte, error) {
	payload := map[string]interface{}{}
	err := json.Unmarshal([]byte(c.RequestPayload), &payload)
	if err != nil {
		return nil, err
	}
	return json.Marshal(payload)
}

func (c CreateDto) RequestPayloadWithEncounterId() ([]byte, error) {
	payload := map[string]interface{}{}

	err := json.Unmarshal([]byte(c.RequestPayload), &payload)
	if err != nil {
		return nil, err
	}

	payload["encounter_id"] = c.Encounter_Id

	return json.Marshal(payload)
}

type SepResponse struct {
	MetaData MetaData   `json:"metaData"`
	Response *SepDetail `json:"response"`
}

type MetaData struct {
	Code    string `json:"code"`
	Message string `json:"message"`
}

type SepDetail struct {
	AssestmenPel       AssestmenPel   `json:"assestmenPel"`
	Catatan            string         `json:"catatan"`
	Cob                string         `json:"cob"`
	Diagnosa           string         `json:"diagnosa"`
	Dpjp               Dpjp           `json:"dpjp"`
	ESep               string         `json:"eSEP"`
	FlagProcedure      FlagProcedure  `json:"flagProcedure"`
	Informasi          any            `json:"informasi"` // null = interface{}
	JnsPelayanan       string         `json:"jnsPelayanan"`
	Katarak            string         `json:"katarak"`
	KdPenunjang        KdPenunjang    `json:"kdPenunjang"`
	KdStatusKecelakaan string         `json:"kdStatusKecelakaan"`
	KelasRawat         string         `json:"kelasRawat"`
	KlsRawat           KlsRawat       `json:"klsRawat"`
	Kontrol            Kontrol        `json:"kontrol"`
	LokasiKejadian     LokasiKejadian `json:"lokasiKejadian"`
	NmStatusKecelakaan string         `json:"nmstatusKecelakaan"`
	NoRujukan          string         `json:"noRujukan"`
	NoSep              string         `json:"noSep"`
	Penjamin           any            `json:"penjamin"` // null
	Peserta            Peserta        `json:"peserta"`
	Poli               string         `json:"poli"`
	PoliEksekutif      string         `json:"poliEksekutif"`
	TglSep             string         `json:"tglSep"`
	TujuanKunj         TujuanKunj     `json:"tujuanKunj"`
}

type AssestmenPel struct {
	Kode string `json:"kode"`
	Nama string `json:"nama"`
}

type Dpjp struct {
	KdDPJP string `json:"kdDPJP"`
	NmDPJP string `json:"nmDPJP"`
}

type FlagProcedure struct {
	Kode string `json:"kode"`
	Nama string `json:"nama"`
}

type KdPenunjang struct {
	Kode string `json:"kode"`
	Nama string `json:"nama"`
}

type KlsRawat struct {
	KlsRawatHak     string  `json:"klsRawatHak"`
	KlsRawatNaik    *string `json:"klsRawatNaik"`    // nullable
	Pembiayaan      *string `json:"pembiayaan"`      // nullable
	PenanggungJawab *string `json:"penanggungJawab"` // nullable
}

type Kontrol struct {
	KdDokter *string `json:"kdDokter"` // null
	NmDokter *string `json:"nmDokter"` // null
	NoSurat  *string `json:"noSurat"`  // null
}

type LokasiKejadian struct {
	KdKab       *string `json:"kdKab"`
	KdKec       *string `json:"kdKec"`
	KdProp      *string `json:"kdProp"`
	KetKejadian *string `json:"ketKejadian"`
	Lokasi      *string `json:"lokasi"`
	TglKejadian *string `json:"tglKejadian"`
}

type Peserta struct {
	Asuransi   any    `json:"asuransi"`
	HakKelas   string `json:"hakKelas"`
	JnsPeserta string `json:"jnsPeserta"`
	Kelamin    string `json:"kelamin"`
	Nama       string `json:"nama"`
	NoKartu    string `json:"noKartu"`
	NoMR       string `json:"noMr"`
	TglLahir   string `json:"tglLahir"`
}

type TujuanKunj struct {
	Kode string `json:"kode"`
	Nama string `json:"nama"`
}

type SepDeleteRequest struct {
	Request struct {
		TSep struct {
			NoSep string `json:"noSep"`
			User  string `json:"user"`
		} `json:"t_sep"`
	} `json:"request"`
}
