from asgiref.sync import sync_to_async

@sync_to_async
def objBodyPost(uuid1, item, location_id, organization_id, created_at, waktu_masuk, waktu_keluar):
    return {
        "resourceType": "Bundle",
        "type": "transaction",
        "entry": [
            {
                "fullUrl": f"urn:uuid:{str(uuid1)}",
                "resource": {
                    "resourceType": "Encounter",
                    "status": "finished",
                    "class": {
                        "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode",
                        "code": "AMB",
                        "display": "ambulatory"
                    },
                    "subject": {
                        "reference": f"Patient/{item.pasien.satusehat_id}",
                        "display": item.pasien.satusehat_name
                    },
                    "participant": [
                        {
                            "type": [
                                {
                                    "coding": [
                                        {
                                            "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
                                            "code": "ATND",
                                            "display": "attender"
                                        }
                                    ]
                                }
                            ],
                            "individual": {
                                "reference": f"Practitioner/{item.dokter.satusehat_id}",
                                "display": item.dokter.satusehat_name
                            }
                        }
                    ],
                    "period": {
                        "start": created_at,
                        "end": waktu_keluar
                    },
                    "location": [
                        {
                            "location": {
                                "reference": f"Location/{location_id}",
                                "display": "Ruang 1A, Poliklinik Rawat Jalan Umum Terpadu"
                            }
                        }
                    ],
                    "diagnosis": [],
                    "statusHistory": [
                        {
                            "status": "arrived",
                            "period": {
                                "start": created_at,
                                "end": waktu_keluar
                            }
                        },
                        {
                            "status": "in-progress",
                            "period": {
                                "start": waktu_masuk,
                                "end": waktu_keluar
                            }
                        },
                        {
                            "status": "finished",
                            "period": {
                                "start": waktu_masuk,
                                "end": waktu_keluar
                            }
                        }
                    ],
                    "serviceProvider": {
                        "reference": f"Organization/{organization_id}"
                    },
                    "identifier": [
                        {
                            "system": f"http://sys-ids.kemkes.go.id/encounter/{organization_id}",
                            "value": item.pasien.satusehat_id
                        }
                    ]
                },
                "request": {
                    "method": "POST",
                    "url": "Encounter"
                }
            },
        ]
    }

@sync_to_async
def objIcd10Rank1(uuid_icd10_primer, diagnosa):
    return {
        "condition": {
            "reference": f"urn:uuid:{str(uuid_icd10_primer)}",
            "display": diagnosa[0].icd10.diagnosa
        },
        "use": {
            "coding": [
                {
                    "system": "http://terminology.hl7.org/CodeSystem/diagnosis-role",
                    "code": "DD",
                    "display": "Discharge diagnosis"
                }
            ]
        },
        "rank": 1
    }

@sync_to_async
def objIcd10Rank2(uuid_icd10_sekunder, diagnosa):
    return {
        "condition": {
            "reference": f"urn:uuid:{str(uuid_icd10_sekunder)}",
            "display": diagnosa[1].icd10.diagnosa
        },
        "use": {
            "coding": [
                {
                    "system": "http://terminology.hl7.org/CodeSystem/diagnosis-role",
                    "code": "DD",
                    "display": "Discharge diagnosis"
                }
            ]
        },
        "rank": 2
    }

@sync_to_async
def objIcd10Primer(uuid1, item, uuid_icd10_primer, diagnosa, tanggal_masuk):
    return {
        "fullUrl": f"urn:uuid:{str(uuid_icd10_primer)}",
        "resource": {
            "resourceType": "Condition",
            "clinicalStatus": {
                "coding": [
                    {
                        "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
                        "code": "active",
                        "display": "Active"
                    }
                ]
            },
            "category": [
                {
                    "coding": [
                        {
                            "system": "http://terminology.hl7.org/CodeSystem/condition-category",
                            "code": "encounter-diagnosis",
                            "display": "Encounter Diagnosis"
                        }
                    ]
                }
            ],
            "code": {
                "coding": [
                    {
                        "system": "http://hl7.org/fhir/sid/icd-10",
                        "code": diagnosa[0].icd10.kode,
                        "display": diagnosa[0].icd10.diagnosa
                    }
                ]
            },
            "subject": {
                "reference": f"Patient/{item.pasien.satusehat_id}",
                "display": item.pasien.satusehat_name
            },
            "encounter": {
                "reference": f"urn:uuid:{str(uuid1)}",
                "display": f"Kunjungan {item.pasien.satusehat_name} pada tanggal {tanggal_masuk}"
            }
        },
        "request": {
            "method": "POST",
            "url": "Condition"
        }
    }

@sync_to_async
def objIcd10Sekunder(uuid1, item, uuid_icd10_sekunder, diagnosa, tanggal_masuk):
    return {
        "fullUrl": f"urn:uuid:{str(uuid_icd10_sekunder)}",
        "resource": {
            "resourceType": "Condition",
            "clinicalStatus": {
                "coding": [
                    {
                        "system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
                        "code": "active",
                        "display": "Active"
                    }
                ]
            },
            "category": [
                {
                    "coding": [
                        {
                            "system": "http://terminology.hl7.org/CodeSystem/condition-category",
                            "code": "encounter-diagnosis",
                            "display": "Encounter Diagnosis"
                        }
                    ]
                }
            ],
            "code": {
                "coding": [
                    {
                        "system": "http://hl7.org/fhir/sid/icd-10",
                        "code": diagnosa[1].icd10.kode,
                        "display": diagnosa[1].icd10.diagnosa
                    }
                ]
            },
            "subject": {
                "reference": f"Patient/{item.pasien.satusehat_id}",
                "display": item.pasien.satusehat_name
            },
            "encounter": {
                "reference": f"urn:uuid:{str(uuid1)}",
                "display": f"Kunjungan {item.pasien.satusehat_name} tanggal {tanggal_masuk}"
            }
        },
        "request": {
            "method": "POST",
            "url": "Condition"
        }
    }

