from django.core.management.base import BaseCommand
from otentifikasi.models import Biodata
from pemeriksaan.models import Pendaftaran, PendaftaranViews, PemeriksaanPendaftaranViews, InputIcd10
import json
import requests
import time
import uuid
from django.http import JsonResponse
from faskes.models import InformasiDasarFaskes
from django.db import transaction
from django.db.models import Q, F
from datetime import date, datetime, timedelta
from openpyxl import Workbook
from openpyxl.styles import Alignment, Font, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
from io import BytesIO
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from pelayanan.models import InvoiceLayanan
from penjualan.models import InvoiceBarang
import os
import pandas as pd

faskes_info = InformasiDasarFaskes.objects.first()
api_url = faskes_info.auth_url
base_url = faskes_info.base_url
consent_url = faskes_info.consent_url
organization_id = faskes_info.organization_id
client_id = faskes_info.client_id
client_secret = faskes_info.secret_key
location_id = faskes_info.location_id
location_name = faskes_info.location_name 
faskes_name = faskes_info.nama  
faskes_server = faskes_info.ip_server  

class Command(BaseCommand):
    help = 'Executes a cron job function to send data satusehat'

    def handle(self, *args, **options):
        satusehat_bundle()
        # send_backup_email()
        
def change_gender():
    file_name = 'template-migrasi-data-pasien-assyifa.xlsx'
    file_path = os.path.join('templates', 'import', 'excel', file_name)
    
    df = pd.read_excel(file_path, usecols=range(0, 22), skiprows=6)  # Adjusted to read columns 1 to 21
    if not df.empty:
        data_list = df.values.tolist()  # Convert DataFrame to a list of lists
        for item in data_list:  # Iterate through each item in the data list
            row = {
                'nomor_induk_kependudukan': item[0] if not pd.isna(item[0]) else '',
                'nomor_kartu_bpjs': item[1] if not pd.isna(item[1]) else '',
                'first_name': item[2] if not pd.isna(item[2]) else '',
                'tanggal_lahir': item[3].strftime('%Y-%m-%d') if not pd.isna(item[3]) and isinstance(item[3], datetime) else '1999-09-09',
                'pekerjaan': item[4] if not pd.isna(item[4]) else '',
                'jenis_kelamin': item[5] if not pd.isna(item[5]) else '',
                'alamat': item[6] if not pd.isna(item[6]) else '',
                'kontak': item[7] if not pd.isna(item[7]) else '',
                'tgl_kunjungan': item[8].strftime('%Y-%m-%d') if not pd.isna(item[8]) and isinstance(item[8], datetime) else '',
                'keluhan': item[9] if not pd.isna(item[9]) else '',
                'tensi': item[10] if not pd.isna(item[10]) else '',
                'berat_badan': item[11] if not pd.isna(item[11]) else '',
                'tinggi_badan': item[12] if not pd.isna(item[12]) else '',
                'status_pasien': item[13] if not pd.isna(item[13]) else '',
                'kunjungan_poli': item[14] if not pd.isna(item[14]) else '',
                'layanan': item[15] if not pd.isna(item[15]) else '',
                'dokter': item[16] if not pd.isna(item[16]) else '',
                'jenis_tindakan': item[17] if not pd.isna(item[17]) else '',
                'icd10_primer': item[18] if not pd.isna(item[18]) else '',
                'diagnosa_primer': item[19] if not pd.isna(item[19]) else '',
                'icd10_sekunder': item[20] if not pd.isna(item[20]) else '',
                'diagnosa_sekunder': item[21] if not pd.isna(item[21]) else '',
            }
            
            if not isinstance(row['jenis_kelamin'], int):
                # check_alpa = re.sub(r'[^a-zA-Z0-9]', '', row['jenis_kelamin'])
                try:
                    jenis_kelamin = 'male' if row['jenis_kelamin'] == 'Male' else 'female'
                except IndexError:
                    jenis_kelamin = 'male'
            else:
                jenis_kelamin = 'male'

            pasien = Biodata.objects.filter(first_name__exact=row['first_name'], tanggal_lahir=row['tanggal_lahir']).first()
            if pasien is not None:
                pasien.jenis_kelamin = jenis_kelamin
                pasien.save()
                print(f'Berhasil : {row["first_name"]}')
            
    print('Data imported successfully.')

def send_log(res, datetime):
    data_to_write = f"{datetime}: {res}"
    print(data_to_write)
    with open('/home/megagrou/assyifa.aklik.id/satusehat_logs.txt', 'a') as file:
        file.write(data_to_write + '\n')

def satusehat_bundle():
    access_payload = {
        'client_id': client_id,
        'client_secret': client_secret,
    }
    
    try:
        response = requests.post(api_url + "/accesstoken?grant_type=client_credentials", data=access_payload, headers={'Content-Type': 'application/x-www-form-urlencoded'})
        response.raise_for_status() 
        json_response = response.json() 
        auth_token = json_response.get('access_token')
        with transaction.atomic():
            faskes_info.auth_token = json_response.get('access_token')
            faskes_info.save()
        headers = {
            'Authorization': f'Bearer {faskes_info.auth_token}',  
            'Content-Type': 'application/json',
        }
        get_pendaftaran = Pendaftaran.objects.exclude(pasien__nomor_induk_kependudukan='').filter(Q(pasien__nomor_induk_kependudukan__regex=r'^\d{16}$') & (Q(satusehat_status=0) | Q(satusehat_status__isnull=True)))
        for item in get_pendaftaran:
            if item.status == 'selesai':
                check_satusehat_id = item.pasien.satusehat_id
                if check_satusehat_id is not None and isinstance(check_satusehat_id, str) and check_satusehat_id.startswith('P'):
                    tanggal_masuk = item.waktu_masuk.strftime("%d %B %Y")
                    created_at = item.created_at.strftime("%Y-%m-%dT%H:%M:%S+00:00")
                    waktu_masuk = item.waktu_masuk.strftime("%Y-%m-%dT%H:%M:%S+00:00")
                    waktu_keluar = item.waktu_keluar.strftime("%Y-%m-%dT%H:%M:%S+00:00")
                    params = {
                        'tanggal_masuk': tanggal_masuk,
                        'waktu_masuk': waktu_masuk,
                        'created_at': created_at,
                        'waktu_keluar': waktu_keluar,
                        'pasien_satusehat_id': item.pasien.satusehat_id,
                        'pasien_satusehat_name': item.pasien.satusehat_name,
                        'dokter_satusehat_id': item.dokter.satusehat_id,
                        'dokter_satusehat_name': item.dokter.satusehat_name,
                    }
                    send_data_to_satusehat(item.id, params)
                    time.sleep(3)
                else:
                    try:
                        response = requests.get(base_url + f"/Patient?identifier=https://fhir.kemkes.go.id/id/nik|{item.pasien.nomor_induk_kependudukan}", headers=headers)
                        response.raise_for_status()  # Raises an HTTPError for bad responses (4xx or 5xx)
                        # Check the response
                        # print(response.text)
                        # print(response.json())
                        if response.status_code == 200 or response.status_code == 201:
                            data = response.json()
                            if data['total'] == 1:
                                patient_number = data['entry'][0]['resource']['id']
                                patient_name = data['entry'][0]['resource']['name'][0]['text']
                                get_biodata = Biodata.objects.get(nomor_induk_kependudukan=item.pasien.nomor_induk_kependudukan)
                                get_biodata.satusehat_id = patient_number
                                get_biodata.satusehat_name = patient_name
                                get_biodata.save()
                                time.sleep(3)
                                # SEND DATA TO SATUSEHAT DISINI
                                tanggal_masuk = item.waktu_masuk.strftime("%d %B %Y")
                                created_at = item.created_at.strftime("%Y-%m-%dT%H:%M:%S+00:00")
                                waktu_masuk = item.waktu_masuk.strftime("%Y-%m-%dT%H:%M:%S+00:00")
                                waktu_keluar = item.waktu_keluar.strftime("%Y-%m-%dT%H:%M:%S+00:00")
                                params = {
                                    'tanggal_masuk': tanggal_masuk,
                                    'waktu_masuk': waktu_masuk,
                                    'created_at': created_at,
                                    'waktu_keluar': waktu_keluar,
                                    'pasien_satusehat_id': patient_number,
                                    'pasien_satusehat_name': patient_name,
                                    'dokter_satusehat_id': item.dokter.satusehat_id,
                                    'dokter_satusehat_name': item.dokter.satusehat_name,
                                }
                                print(f"MIE SUKSES ISI 2 - {patient_number}")
                                send_data_to_satusehat(item.id, params)
                                time.sleep(3)
                        else:
                            json_data = json.dumps(response.json())
                            print(json_data)
                            timestamp = datetime.now().isoformat()
                            send_log(json_data, timestamp)
                    except Biodata.MultipleObjectsReturned:
                        json_data = f"{item.id} - Multiple Biodata objects returned. Skipping..."
                        timestamp = datetime.now().isoformat()
                        send_log(json_data, timestamp)
                    except requests.Timeout:
                        print("Request timed out")
                        json_data = json.dumps(response.json())
                        timestamp = datetime.now().isoformat()
                        send_log(json_data, timestamp)
                    except requests.TooManyRedirects:
                        json_data = "Too many redirects"
                        timestamp = datetime.now().isoformat()
                        send_log(json_data, timestamp)
                    except requests.RequestException as e:
                        json_data = f"{item.id} - Request exception: {str(e)}"
                        timestamp = datetime.now().isoformat()
                        send_log(json_data, timestamp)
        print("LOOPING BERESSSSSS...")
        # send_backup_email()

    except requests.exceptions.RequestException as err:
        json_data = json.dumps({'error': str(err)})  # Convert exception to JSON string
        timestamp = datetime.now().isoformat()
        send_log(json_data, timestamp)


def send_data_to_satusehat(item_id, params):
    if InputIcd10.objects.filter(pendaftaran_id=item_id).exists():
        diagnosa = InputIcd10.objects.filter(pendaftaran_id=item_id)[:2]
        uuid1 = uuid.uuid4()
        uuid_icd10_primer = uuid.uuid4()
        uuid_icd10_sekunder = uuid.uuid4()

        body_post = {
            "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/{params['pasien_satusehat_id']}",
                            "display": params['pasien_satusehat_name']
                        },
                        "participant": [
                            {
                                "type": [
                                    {
                                        "coding": [
                                            {
                                                "system": "http://terminology.hl7.org/CodeSystem/v3-ParticipationType",
                                                "code": "ATND",
                                                "display": "attender"
                                            }
                                        ]
                                    }
                                ],
                                "individual": {
                                    "reference": f"Practitioner/{params['dokter_satusehat_id']}",
                                    "display": params['dokter_satusehat_name']
                                }
                            }
                        ],
                        "period": {
                            "start": params['created_at'],
                            "end": params['waktu_keluar']
                        },
                        "location": [
                            {
                                "location": {
                                    "reference": f"Location/{location_id}",
                                    "display": location_name
                                }
                            }
                        ],
                        "diagnosis": [],
                        "statusHistory": [
                            {
                                "status": "arrived",
                                "period": {
                                    "start": params['created_at'],
                                    "end": params['waktu_keluar']
                                }
                            },
                            {
                                "status": "in-progress",
                                "period": {
                                    "start": params['waktu_masuk'],
                                    "end": params['waktu_keluar']
                                }
                            },
                            {
                                "status": "finished",
                                "period": {
                                    "start": params['waktu_masuk'],
                                    "end": params['waktu_keluar']
                                }
                            }
                        ],
                        "serviceProvider": {
                            "reference": f"Organization/{organization_id}"
                        },
                        "identifier": [
                            {
                                "system": f"http://sys-ids.kemkes.go.id/encounter/{organization_id}",
                                "value": params['pasien_satusehat_id']
                            }
                        ]
                    },
                    "request": {
                        "method": "POST",
                        "url": "Encounter"
                    }
                },
            ]
        }

        if len(diagnosa) >= 2:
            icd10rank1 = {
                "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
            }
            icd10rank2 = {
                "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
            }

            icd101 = {
                "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/{params['pasien_satusehat_id']}",
                        "display": params['pasien_satusehat_name']
                    },
                    "encounter": {
                        "reference": f"urn:uuid:{str(uuid1)}",
                        "display": f"Kunjungan {params['pasien_satusehat_name']} pada tanggal {params['tanggal_masuk']}"
                    }
                },
                "request": {
                    "method": "POST",
                    "url": "Condition"
                }
            }

            icd102 = {
                "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[0].icd10.kode,
                                "display": diagnosa[0].icd10.diagnosa
                            }
                        ]
                    },
                    "subject": {
                        "reference": f"Patient/{params['pasien_satusehat_id']}",
                        "display": params['pasien_satusehat_name']
                    },
                    "encounter": {
                        "reference": f"urn:uuid:{str(uuid1)}",
                        "display": f"Kunjungan {params['pasien_satusehat_name']} tanggal {params['tanggal_masuk']}"
                    }
                },
                "request": {
                    "method": "POST",
                    "url": "Condition"
                }
            }

            body_post['entry'][0]['resource'].setdefault("diagnosis", []).append(icd10rank1)
            body_post.setdefault("entry", []).append(icd101)
            body_post['entry'][0]['resource'].setdefault("diagnosis", []).append(icd10rank2)
            body_post.setdefault("entry", []).append(icd102)

        else:
            icd10rank1 = {
                "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
            }

            icd101 = {
                "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/{params['pasien_satusehat_id']}",
                        "display": params['pasien_satusehat_name']
                    },
                    "encounter": {
                        "reference": f"urn:uuid:{str(uuid1)}",
                        "display": f"Kunjungan {params['pasien_satusehat_name']} pada tanggal {params['tanggal_masuk']}"
                    }
                },
                "request": {
                    "method": "POST",
                    "url": "Condition"
                }
            }

            body_post['entry'][0]['resource'].setdefault("diagnosis", []).append(icd10rank1)
            body_post.setdefault("entry", []).append(icd101)

        payload_json = json.dumps(body_post)
        # print(payload_json)
        try:
            if hasattr(Pendaftaran, 'json_response'):
                auth = faskes_info.auth_token
                headers = {
                    'Authorization': f'Bearer {auth}',
                    'Content-Type': 'application/json',
                }
                response = requests.post(base_url, data=payload_json, headers=headers)
                response.raise_for_status()  # Raises an HTTPError for bad responses (4xx or 5xx)
                # Check the response
                if response.status_code == 200 or response.status_code == 201:
                    json_data = json.dumps(response.json())
                    Pendaftaran.objects.filter(id=item_id).update(satusehat_status=1, json_response=json_data)
                    print(f"SUKSES TERKIRIM - {item_id}")
                    time.sleep(2)
                else:
                    rjson = json.dumps(response.json())
                    json_data = f"{item_id}-{rjson}"
                    timestamp = datetime.now().isoformat()
                    send_log(json_data, timestamp)
            else:
                json_data = f"json_response tidak ada"
                timestamp = datetime.now().isoformat()
                send_log(json_data, timestamp)
        except requests.Timeout:
            json_data = f"Request timed out: {item_id}"
            timestamp = datetime.now().isoformat()
            send_log(json_data, timestamp)
            time.sleep(3)
            # obj = Command()
            # obj.satusehat_bundle()
        except requests.TooManyRedirects:
            json_data = f"Too many redirects: {item_id}"
            timestamp = datetime.now().isoformat()
            send_log(json_data, timestamp)
            time.sleep(3)
            # obj = Command()
            # obj.satusehat_bundle()
        except requests.RequestException as e:
            json_data = f"{item_id} - Request exception: {str(e)} \n MASUK:{params['waktu_masuk']} KELUAR: {params['waktu_keluar']}"
            timestamp = datetime.now().isoformat()
            send_log(json_data, timestamp)
            time.sleep(3)
            # obj = Command()
            # obj.satusehat_bundle()
    else:
        json_data = f"DIAGNOSA TIDAK DI INPUT: {item_id}"
        timestamp = datetime.now().isoformat()
        send_log(json_data, timestamp)
        
def stringFromArray(name, array):
    lists = [getattr(item, name, "") for item in array]
    lists = [value for value in lists if value]
    if len(lists) > 1:
        concated = ', '.join(lists)
    else:
        concated = lists[0] if lists else ""
    
    return concated

def checkUsia(date_of_birth):
    # Convert the date of birth string to a datetime object
    dob = datetime.strptime(str(date_of_birth), '%Y-%m-%d')

    # Calculate the current date
    current_date = datetime.now()

    # Calculate the difference in years
    age = current_date.year - dob.year

    # Adjust the age if the birthdate has not occurred this year yet
    if current_date.month < dob.month or (current_date.month == dob.month and current_date.day < dob.day):
        age -= 1

    return age

def generate_excel_backup():
    # Create a new workbook and select the active sheet
    output = BytesIO()
    wb = Workbook()
    ws = wb.active

    # Define the title
    ws.merge_cells("A1:P1")
    title = "LAPORAN DATA PASIEN"

    # Set the title in cell A1 with bold font
    title_cell = ws.cell(row=1, column=1, value=title)
    title_cell.alignment = Alignment(horizontal='center', vertical='center')
    title_cell.font = Font(bold=True)

    # Define the subtitle
    ws.merge_cells("A2:P2")
    info_dasar_faskes = InformasiDasarFaskes.objects.first()
    subtitle = info_dasar_faskes.nama

    # Set the subtitle in cell A1 with bold font
    subtitle_cell = ws.cell(row=2, column=1, value=subtitle)
    subtitle_cell.alignment = Alignment(horizontal='center', vertical='center')
    subtitle_cell.font = Font(bold=True)

    # Define the title
    ws.merge_cells("A3:P3")
    alamat = info_dasar_faskes.alamat

    # Set the alamat in cell A1 with bold font
    alamat_cell = ws.cell(row=3, column=1, value=alamat)
    alamat_cell.alignment = Alignment(horizontal='center', vertical='center')

    # Define the email
    ws.merge_cells("A4:P4")
    email = "email: -"

    # Set the email in cell A1 with bold font
    email_cell = ws.cell(row=4, column=1, value=email)
    email_cell.alignment = Alignment(horizontal='center', vertical='center')
    email_font = Font(bold=True, color="0000FF")  # "0000FF" is the code for blue
    email_cell.font = email_font

    # Define the column headers
    column_headers = [
        "Medrec", "Nama pasien", "Jenis Kelamin", "Usia", "Berat Badan", "Tinggi Badan", "Tensi", "Status Pasien",
        "Kunjungan POLI", "Layanan",  "Alamat",
        "Dokter", "Jenis tindakan",
        "Kode ICD 10", "Diagnosa", "No Telepon" 
    ]

    # Set the column headers in the worksheet
    for col_num, column_title in enumerate(column_headers, 1):
        cell = ws.cell(row=7, column=col_num, value=column_title)
        cell.alignment = Alignment(horizontal='center')
        cell.font = Font(bold=True)
        
        col_letter = get_column_letter(col_num)
        max_width = max(len(str(column_title)), 15)  # Minimum width of 10 characters
        ws.column_dimensions[col_letter].width = max_width
    
    today = date.today()
    get_today = datetime.strptime(today.strftime('%Y-%m-%d'), '%Y-%m-%d').date()
    base_query = PendaftaranViews.objects.filter(created_at__date=get_today)
    for row_data in base_query:

        getDiagnosa = InputIcd10.objects.filter(pendaftaran_id=row_data.id)
        getDiagnosa = getDiagnosa.annotate(
            diagnosa=F('icd10__diagnosa'),
            kode_diagnosa=F('icd10__kode'),
        )
        # Evaluate the queryset, for example, by converting it to a list
        diagnosa_list = list(getDiagnosa)

        diagnosa = stringFromArray('diagnosa', diagnosa_list)
        kode_diagnosa = stringFromArray('kode_diagnosa', diagnosa_list)

        invoicelayanan = InvoiceLayanan.objects.filter(pendaftaran_id=row_data.id)
        invoicelayanan = invoicelayanan.annotate(
            harga_layanan=F('tarif_layanan__harga')
        )
        # Evaluate the queryset, for example, by converting it to a list
        invoice_list = list(invoicelayanan)
        # return JsonResponse(invoice_list, safe=False)
        total_harga_layanan = 0
        for item in invoice_list:
            total = item.harga_layanan * item.kuantitas
            total_harga_layanan += total
        
        invoicebarang = InvoiceBarang.objects.filter(pendaftaran_id=row_data.id)
        invoicebarang = invoicebarang.annotate(
            harga_barang=F('barang__harga_jual')
        )

        barang_list = list(invoicebarang)
        total_harga_barang = 0
        for item in barang_list:
            total = item.harga_barang * item.kuantitas
            total_harga_barang += total

        totalPembayaran = total_harga_layanan + total_harga_barang
        if row_data.is_new_pasien == 1:
            status_pasien = "LAMA"
        else: 
            status_pasien = "BARU"

        row = [
            row_data.nomor_rekam_medis,
            row_data.nama_pasien,
            row_data.jenis_kelamin,
            checkUsia(row_data.tanggal_lahir),
            row_data.bb,
            row_data.tb,
            row_data.tensi,
            status_pasien,
            "KLINIK UMUM",
            row_data.ruang_rawat_pasien,
            row_data.alamat,
            row_data.nama_dokter,
            row_data.tindakan,
            kode_diagnosa,
            diagnosa,
            row_data.kontak,
        ]
        ws.append(row)


    # Apply style to "Pasien BPJS" column with a yellow background
    yellow_fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
    cell = ws['H7']
    cell.fill = yellow_fill
    
    border = Border(left=Side(style='thin'), 
                    right=Side(style='thin'),
                    top=Side(style='thin'),
                    bottom=Side(style='thin'))

    for row in ws.iter_rows(min_row=7, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
        for cell in row:
            cell.border = border

    wb.save(output)
    output.seek(0)  # Seek to the beginning of the file

    return output

def send_backup_email():
    try:
        # Generate the Excel file
        excel_file = generate_excel_backup()
        current_date = datetime.now().strftime('%d_%b_%Y')
        current_date_text = datetime.now().strftime('%d %b %Y')
        filename = f"rekam_medis_backup_{current_date}.xlsx"

        txt_content = render_to_string('pemeriksaan/email_template.txt', {
            'faskes_name': faskes_name,
            'faskes_server': faskes_server,
            'current_date_text': current_date_text,
        })

        # Create an EmailMessage object
        email = EmailMessage(
            subject=f'File Backup AKLIK - {current_date_text}',
            body=txt_content,
            from_email='info@aklik.id',
            to=['klinik.norma.masitha@gmail.com'],
        )
        email.content_subtype = 'plain'

        # Attach the Excel file to the email
        email.attach(filename, excel_file.read(), 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')

        # Send the email
        email.send(fail_silently=False)

        print('Email sent successfully!')
    except Exception as e:
        print(f'Error: {str(e)}')