<?php 
 
namespace App\Controller; 
 
use App\Entity\{CaseHistory, CaseMedicine, CaseReferral, Cases, HivRegister, TBRegister, WardBed}; 
use App\Form\{CaseReferralType, CaseType}; 
use App\Repository\{CaseRepository, HivRegisterRepository, PatientRepository, TBRegisterRepository}; 
use App\Service\{Pagination, Abha}; 
use Doctrine\ORM\EntityManagerInterface; 
use Dompdf\Dompdf; 
use Dompdf\Options; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\{IsGranted, Security}; 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\{JsonResponse, Request, Response}; 
use Symfony\Component\Routing\Annotation\Route; 
use Nzo\UrlEncryptorBundle\Annotations\ParamDecryptor; 
use Nzo\UrlEncryptorBundle\Encryptor\Encryptor; 
use Symfony\Component\HttpFoundation\Session\SessionInterface; 
use Symfony\Component\HttpClient\HttpClient; 
use Doctrine\Persistence\ManagerRegistry; 
 
#[Route(path: '/cases'), IsGranted(data: 'IS_AUTHENTICATED_REMEMBERED')] 
class CaseController extends AbstractController 
{ 
    private $encryptor; 
 
    public function __construct(Encryptor $encryptor, private ManagerRegistry $doctrine) 
    { 
        $this->encryptor = $encryptor; 
    } 
 
    #[Route(path: '/', name: 'case_index', methods: ['GET'])] 
    public function index(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        if ($this->isGranted('ROLE_DOC')) { 
            $qb = $caseRepo->getForDoctors($this->getUser()); 
        } else { 
            $qb = $caseRepo->getForOthers($this->getUser()->getHospital()); 
        } 
 
        if ($request->get('range')) { 
            [$from, $to] = explode(' / ', $request->get('range')); 
 
            if ($from && $to) { 
                $qb 
                    ->andWhere('c.createdAt BETWEEN :from AND :to') 
                    ->setParameter('from', $from) 
                    ->setParameter('to', $to); 
            } 
        } 
 
        $cases = $pagination->paginate($qb->getQuery(), $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Cases' 
        ]); 
    } 
 
    #[Route(path: '/laboratory', name: 'case_lab', methods: ['GET'])] 
    public function labCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getWithLabTests($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Laboratory Summary' 
        ]); 
    } 
 
    #[Route(path: '/pharma', name: 'case_pharma', methods: ['GET'])] 
    public function pharmaCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getPharmaCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Pharmacy Cases' 
        ]); 
    } 
 
    #[Route(path: '/labor', name: 'case_labor', methods: ['GET'])] 
    public function laborCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getLaborCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Labor room Summary' 
        ]); 
    } 
 
    #[Route(path: '/ward', name: 'case_ward', methods: ['GET'])] 
    public function wardCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getWardCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Ward Cases' 
        ]); 
    } 
 
    #[Route(path: '/discharged', name: 'case_discharged', methods: ['GET'])] 
    public function dischargedCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getDischargedCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Discharge Summary' 
        ]); 
    } 
 
    #[Route(path: '/emergency', name: 'case_emergency', methods: ['GET'])] 
    public function emergencyCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getEmergencyCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Emergency Cases' 
        ]); 
    } 
 
    #[Route(path: '/medicolegal', name: 'case_medicolegal', methods: ['GET'])] 
    public function medicolegalCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getMedicolegalCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Medicolegal Cases' 
        ]); 
    } 
 
    #[Route(path: '/mortality', name: 'case_mortality', methods: ['GET'])] 
    public function mortalityCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getMortalityCases($this->getUser()->getHospital()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Mortality Cases' 
        ]); 
    } 
 
    #[Route(path: '/expert-opinions', name: 'case_exprt_opinion', methods: ['GET']), IsGranted(data: 'ROLE_DOC')] 
    public function expertOpinionCases(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $query = $caseRepo->getExpertOpinionCases($this->getUser()); 
 
        $cases = $pagination->paginate($query, $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/expert_opinions.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases) 
        ]); 
    } 
 
    #[Route(path: '/add-expert-opinion/{id}', name: 'case_add_exprt_opinion', methods: ['GET', 'POST']), IsGranted(data: 'ROLE_DOC')] 
    #[ParamDecryptor(["id"])] 
    public function addOpinion(Request $request, CaseReferral $caseRef, CaseRepository $caseRepo, EntityManagerInterface $entityManager): Response 
    { 
        $form = $this->createForm(CaseReferralType::class, $caseRef); 
        $form->handleRequest($request); 
 
        if ($form->isSubmitted() && $form->isValid()) { 
            $entityManager->flush(); 
 
            $this->addFlash( 
                'success', 
                'Expert Opinion added successfully!' 
            ); 
 
            return $this->redirectToRoute('case_exprt_opinion'); 
        } 
 
        $case = $caseRef->getCase(); 
        $symptoms = $caseRepo->getCaseSymptoms($case->getId()); 
        $provisionalExaminations = $caseRepo->getCaseProvisionalExaminations($case->getId()); 
        $provisionalDiagnosis = $caseRepo->getCaseProvisionalDiagnosis($case->getId()); 
        $clinicalPatterns = $caseRepo->getCaseClinicalPatterns($case->getId()); 
 
        return $this->renderForm('cases/add_opinion.html.twig', [ 
            'form' => $form, 
            'case' => $case, 
            'case_tests' => $caseRepo->getCaseTests($case->getId()), 
            'case_medicines' => $caseRepo->getCaseMedicines($case->getId()), 
            'symptoms' => $symptoms ? implode(', ', $symptoms) : '—', 
            'provisional_diagnosis' => $provisionalDiagnosis ? implode(', ', $provisionalDiagnosis) : '—', 
            'provisional_examinations' => $provisionalExaminations ? implode(', ', $provisionalExaminations) : '—', 
            'clinical_patterns' => $clinicalPatterns ? implode(', ', $clinicalPatterns) : '—' 
        ]); 
    } 
 
    #[Route(path: '/print-ref-letter/{id}', name: 'case_print_ref_letter', methods: ['GET']), IsGranted(data: 'ROLE_DOC')] 
    #[ParamDecryptor(["id"])] 
    public function printRefLetter(CaseReferral $caseRef, CaseRepository $caseRepo) 
    { 
        $caseId = $caseRef->getCase()->getId(); 
 
        return $this->render('cases/print_ref_letter.html.twig', [ 
            'case_ref' => $caseRef, 
            'action_type' => 'print', 
            'prov_diags' => implode(', ', $caseRepo->getCaseProvisionalDiagnosis($caseId)), 
            'prov_exam' => implode(', ', $caseRepo->getCaseProvisionalExaminations($caseId)), 
            'treatment_given' => implode('<br>', array_merge( 
                array_column($caseRepo->getCaseMedicines($caseId), 'name'), 
                array_column($caseRepo->getCaseWardMedicines($caseId), 'name') 
            )) 
        ]); 
    } 
 
    #[Route(path: '/download-ref-letter/{id}', name: 'case_pdf_ref_letter', methods: ['GET']), IsGranted(data: 'ROLE_DOC')] 
    #[ParamDecryptor(["id"])] 
    public function downloadRefLetter(CaseReferral $caseRef, CaseRepository $caseRepo) 
    { 
        $caseId = $caseRef->getCase()->getId(); 
 
        $html = $this->renderView('cases/print_ref_letter.html.twig', [ 
            'case_ref' => $caseRef, 
            'action_type' => 'pdf', 
            'prov_diags' => implode(', ', $caseRepo->getCaseProvisionalDiagnosis($caseId)), 
            'prov_exam' => implode(', ', $caseRepo->getCaseProvisionalExaminations($caseId)), 
            'treatment_given' => implode('<br>', array_merge( 
                array_column($caseRepo->getCaseMedicines($caseId), 'name'), 
                array_column($caseRepo->getCaseWardMedicines($caseId), 'name') 
            )) 
        ]); 
 
        $dompdf = new Dompdf(); 
        $dompdf->loadHtml($html); 
        $dompdf->setPaper('A4', 'portrait'); 
        $dompdf->render(); 
        $dompdf->stream('referral-letter.pdf', [ 
            'Attachment' => true 
        ]); 
    } 
 
    #[Route(path: '/patient-summary', name: 'case_summary', methods: ['GET'])] 
    public function casesSummary(Request $request, Pagination $pagination, CaseRepository $caseRepo): Response 
    { 
        $qb = $caseRepo->getAllCases($this->getUser()->getHospital()); 
 
        if ($request->get('range')) { 
            [$from, $to] = explode(' / ', $request->get('range')); 
 
            if ($from && $to) { 
                $qb 
                    ->andWhere('c.createdAt BETWEEN :from AND :to') 
                    ->setParameter('from', $from) 
                    ->setParameter('to', $to); 
            } 
        } 
 
        $cases = $pagination->paginate($qb->getQuery(), $request, $this->getParameter('items_per_page')); 
 
        return $this->render('cases/index.html.twig', [ 
            'cases' => $cases, 
            'last_page' => $pagination->lastPage($cases), 
            'title' => 'Patients Summary' 
        ]); 
    } 
 
    #[Route(path: '/new', name: 'case_new', methods: ['GET', 'POST'])] 
    #[Security("is_granted('ROLE_RECEP') or is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_AYUSH') or is_granted('ROLE_DENT')")] 
    public function new(Request $request, CaseRepository $caseRepo, Abha $abha, PatientRepository $patientRepo, EntityManagerInterface $entityManager): Response 
    { 
        $case = new Cases(); 
 
        $role = 'recep'; 
        $template = 'cases/recep_new.html.twig'; 
 
        if ($request->getMethod() == 'GET' && $request->query->has('patient_id')) { 
            $patientId = $this->encryptor->decrypt($request->query->get('patient_id')); 
            $patient = $patientRepo->find(intval($patientId)); 
             
            if ($patient) { 
                $case->setPatient($patient); 
            } 
        } 
 
        $hospital = $this->getUser()->getHospital(); 
 
        if ($this->isGranted('ROLE_DOC') || $this->isGranted('ROLE_AYUSH') || $this->isGranted('ROLE_CHO') || $this->isGranted('ROLE_DENT')) { 
            $case->setDoctor($this->getUser()); 
            $role = 'doc'; 
            $template = 'cases/new.html.twig'; 
        } 
 
        $case->setFollowUpDate(new \DateTime()); 
 
        $form = $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true, 'role' => $role, 'hospital' => $hospital]); 
        $form->handleRequest($request); 
 
        if ($case->getIsWard() && $request->isMethod('POST')) { 
            $getTotalBed = $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']); 
            if (!empty($getTotalBed)) { 
                $getOccupiedBedBedData = $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']); 
                if (!empty($getOccupiedBedBedData)) { 
                    $totalMaleBed = $getTotalBed[0]['total_male_bed']; 
                    $totalFemaleBed = $getTotalBed[0]['total_female_bed']; //1 
                    $availableMaleBad = $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied']; 
                    $availableFemaleBad = $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0 
 
                    if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) { 
                        $this->addFlash( 
                            'danger', 
                            'Male bed is not available.' 
                        ); 
                        return $this->renderForm($template, [ 
                            'case' => $case, 
                            'form' => $form, 
                            'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                            'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                        ]); 
                    } 
 
                    if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) { 
                        $this->addFlash( 
                            'danger', 
                            'Female bed is not available.' 
                        ); 
                        return $this->renderForm($template, [ 
                            'case' => $case, 
                            'form' => $form, 
                            'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                            'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                        ]); 
                    } 
                } 
            } else { 
                $this->addFlash( 
                    'danger', 
                    'Bed not available.' 
                ); 
                return $this->renderForm($template, [ 
                    'case' => $case, 
                    'form' => $form, 
                    'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                    'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                ]); 
            } 
        } 
        if ($form->isSubmitted() && $form->isValid()) { 
            $formData = $request->get('case'); 
            $case->setHospital($hospital); 
 
            $entityManager->getConnection()->setAutoCommit(false); 
            $entityManager->beginTransaction(); 
 
            try { 
                $entityManager->persist($case); 
                $entityManager->flush(); 
 
                $hospitalId = $hospital->getId(); 
 
                if (isset($formData['symptoms']) && !empty($formData['symptoms'])) { 
                    $caseRepo->saveSymptoms($formData['symptoms'], $case); 
                } 
 
                if (isset($formData['ncds']) && !empty($formData['ncds'])) { 
                    $caseRepo->saveNcds($formData['ncds'], $case); 
                } 
                $mrdNo = 'MRD-' . $hospital->getType() . '-' . date('Y') . '-' . sprintf('%04d', $hospital->getId()) . '-' . sprintf('%010d', $case->getId()); 
                if ($role == 'doc') { 
                    if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) { 
                        $caseRepo->saveClinicalPatterns($formData['clinical_patterns'], $case); 
                    } 
 
                    $caseRepo->saveProvisionalExaminations($formData['provisional_examinations'], $case); 
                    $caseRepo->saveProvisionalDiagnosis($formData['provisional_diagnosis'], $case); 
 
                    if ($case->getIsLab()) { 
                        $labTests = []; 
 
                        if (isset($formData['suggestedReports']) && (is_countable($formData['suggestedReports']) ? count($formData['suggestedReports']) : 0) > 0) { 
                            $labTests = array_merge($labTests, $formData['suggestedReports']); 
                        } 
 
                        if (isset($formData['lab_tests']) && (is_countable($formData['lab_tests']) ? count($formData['lab_tests']) : 0) > 0) { 
                            $labTests = array_merge($labTests, $formData['lab_tests']); 
                        } 
 
                        $labTestIds = array_unique($labTests); 
                        $radTests = $formData['generalReports'] ?? []; 
 
                        if (count($labTestIds) == 0 && (is_countable($radTests) ? count($radTests) : 0) == 0) { 
                            $entityManager->rollback(); 
                            $entityManager->clear(); 
 
                            $this->addFlash( 
                                'danger', 
                                'Please select at least one Test report and try again.' 
                            ); 
                            return $this->renderForm($template, [ 
                                'case' => $case, 
                                'form' => $form, 
                                'rad_tests' => '', 
                                'case_medicines' => '', 
                                'case_ward_medicines' => '', 
                                'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                                'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                            ]); 
                        } 
 
                        if (count($labTestIds) > 0) { 
                            $caseRepo->saveLabTests($case->getId(), $hospitalId, $this->getUser()->getId(), $labTestIds); 
                        } 
 
                        if ((is_countable($radTests) ? count($radTests) : 0) > 0) { 
                            $radTestData = []; 
 
                            foreach ($radTests['id'] as $radTestId) { 
                                $radTestData[] = [ 
                                    'case_id' => $case->getId(), 
                                    'lab_test_id' => $radTestId, 
                                    'instruct' => $radTests['instruct'][$radTestId], 
                                    'hospital_id' => $hospitalId, 
                                    'created_by' => $this->getUser()->getId() 
                                ]; 
                            } 
 
                            $caseRepo->saveCaseRadTests($radTestData); 
                        } 
 
                        $case->setLabTestStatus('Pending'); 
                    } 
 
                    if ($case->getIsMedicine()) { 
                        if (!isset($formData['medicines']) || (is_countable($formData['medicines']) ? count($formData['medicines']) : 0) != 6) { 
                            $entityManager->rollback(); 
                            $entityManager->clear(); 
 
                            $this->addFlash( 
                                'danger', 
                                'Please select at least one medicine and try again.' 
                            ); 
 
                            return $this->renderForm($template, [ 
                                'case' => $case, 
                                'form' => $form, 
                                'rad_tests' => '', 
                                'case_medicines' => '', 
                                'case_ward_medicines' => '', 
                                'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                                'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                            ]); 
                        } 
 
                        $medicines = $formData['medicines']; 
 
                        $medicineData = []; 
 
                        foreach ($medicines['id'] as $medicineId) { 
                            $medicineData[] = [ 
                                'case_id' => $case->getId(), 
                                'medicine_id' => $medicineId, 
                                'medicine_type' => $medicines['type'][$medicineId], 
                                'dose' => $medicines['dose'][$medicineId], 
                                'frequency' => $medicines['frequency'][$medicineId], 
                                'num_days' => $medicines['num_days'][$medicineId], 
                                'notes' => $medicines['patient_notes'][$medicineId], 
                                'is_referral' => 0, 
                                'is_opinion' => 0, 
                                'is_rejected' => 0, 
                                'created_by' => $this->getUser()->getId() 
                            ]; 
                        } 
 
                        $caseRepo->saveCaseMedicines($medicineData); 
 
                        $case->setCaseMedicineStatus('Pending'); 
                    } 
 
                    if ($case->getIsReferral()) { 
                        $isOther = $form->get('ref_type')->getData() ?: 0; 
                        $isOpinion = $form->get('ref_is_opinion')->getData(); 
                        $refDoc = $form->get('ref_doctor')->getData(); 
                        $refEmail = $form->get('ref_email')->getData(); 
                        $refNote = $form->get('ref_note')->getData(); 
 
                        $caseRef = new CaseReferral(); 
 
                        $caseRef 
                            ->setCase($case) 
                            ->setIsOther($isOther) 
                            ->setIsOpinion($isOpinion) 
                            ->setDoctor($refDoc) 
                            ->setEmail($refEmail) 
                            ->setNotes($refNote); 
 
                        if ($isOther == 1) { 
                            $caseRef->setHospital($form->get('ref_center')->getData()); 
                        } else { 
                            $caseRef->setHospital($hospital); 
                        } 
 
                        $entityManager->persist($caseRef); 
                    } 
 
                    if ($case->getIsWard()) { 
 
                        $ward = $form->get('ward')->getData(); 
 
                        if (!isset($formData['ward_medicines']) || (is_countable($formData['ward_medicines']) ? count($formData['ward_medicines']) : 0) != 6 || !$ward) { 
                            $entityManager->rollback(); 
                            $entityManager->clear(); 
 
                            $this->addFlash( 
                                'danger', 
                                'Please select at least one medicine and try again.' 
                            ); 
 
                            return $this->renderForm($template, [ 
                                'case' => $case, 
                                'form' => $form, 
                                'rad_tests' => '', 
                                'case_medicines' => '', 
                                'case_ward_medicines' => '', 
                                'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                                'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                            ]); 
                        } 
 
                        if (!$ward) { 
                            $entityManager->rollback(); 
                            $entityManager->clear(); 
 
                            $this->addFlash( 
                                'danger', 
                                'Selected Ward is not available. Please select other Ward and try again.' 
                            ); 
 
                            return $this->renderForm($template, [ 
                                'case' => $case, 
                                'form' => $form, 
                                'rad_tests' => '', 
                                'case_medicines' => '', 
                                'case_ward_medicines' => '', 
                                'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                                'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                            ]); 
                        } 
 
                        $wardBed = new WardBed(); 
                        $wardBed 
                            ->setCase($case) 
                            ->setWard($ward) 
                            ->setStatus('Admitted'); 
 
                        $entityManager->persist($wardBed); 
                        $wardMedicines = $formData['ward_medicines']; 
 
                        $wardMedicineData = []; 
 
                        foreach ($wardMedicines['id'] as $medicineId) { 
                            $wardMedicineData[] = [ 
                                'case_id' => $case->getId(), 
                                'medicine_id' => $medicineId, 
                                'medicine_type' => $wardMedicines['type'][$medicineId], 
                                'dose' => $wardMedicines['dose'][$medicineId], 
                                'frequency' => $wardMedicines['frequency'][$medicineId], 
                                'num_days' => $wardMedicines['num_days'][$medicineId], 
                                'notes' => $wardMedicines['staff_notes'][$medicineId], 
                                'is_emergency' => 0, 
                                'has_stock' => 0, 
                                'created_by' => $this->getUser()->getId() 
                            ]; 
                        } 
                        //TODO when isWard is true then ward medicine status is pending so pharmacy can give medicine to patient 
                        $case->setWardMedicineStatus('Pending'); 
 
                        $caseRepo->saveCaseWardMedicines($wardMedicineData); 
                    } 
 
                    if ($case->getPatient()->getMobile()) { 
                        try { 
                            $client = HttpClient::create(); 
                            $client->request('POST', 'https://dev2-abdm.7mantra.in/m2/sms-notify2', [ 
                                'headers' => [ 
                                    'Content-Type' => 'application/json' 
                                ], 
                                'json' => [ 
                                    'mobile_number' => $case->getPatient()->getMobile(), 
                                    'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(), 
                                    'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName() 
                                ] 
                            ]); 
                        } catch (\Exception) { 
                            $this->addFlash( 
                                'danger', 
                                'Sms not sent.' 
                            ); 
                        } 
                    } 
 
                    if ($case->getPatient()->getHealthAddress()) { 
                        $data['abhaAddress'] = $case->getPatient()->getHealthAddress(); 
                        $data['patientRefNo'] = $case->getPatient()->getUhId(); 
                        $data['hipId'] = $case->getPatient()->getHospital()->getHIPCode(); 
                        $data['contextRef'] = $mrdNo; 
                        $data['contextDisplay'] = 'Case Care Context'; 
                        // $data['hiTypes'] = 'OPConsultation'; 
                        $data['hiTypes'] = 'Prescription'; 
                        $data['reqId'] = $abha->GUID(); 
                        $caseRepo->saveContextDetails($data); 
                    } 
                } 
 
                $case->setMrdId($mrdNo); 
                $entityManager->persist($case); 
                $entityManager->flush(); 
 
                $entityManager->commit(); 
 
                $this->addFlash( 
                    'success', 
                    'New case added successfully!' 
                ); 
 
                return $this->redirectToRoute('case_index'); 
            } catch (\Exception) { 
                $entityManager->rollback(); 
                $entityManager->clear(); 
 
                $this->addFlash( 
                    'danger', 
                    'Something went wrong! Case data could not be saved. Please try again.' 
                ); 
                return $this->renderForm($template, [ 
                    'case' => $case, 
                    'form' => $form, 
                    'rad_tests' => '', 
                    'case_medicines' => '', 
                    'case_ward_medicines' => '', 
                    'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
                    'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
                ]); 
            } 
        } 
 
        return $this->renderForm($template, [ 
            'case' => $case, 
            'form' => $form, 
            'general_reports' => $role == 'doc' ? $caseRepo->getGeneralReports() : [], 
            'essential_drugs' => $role == 'doc' ? $caseRepo->getEssentialDrugs($hospital->getType()) : [] 
        ]); 
    } 
 
    #[Route(path: '/re-open/{id}', name: 'case_reopen', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function reOpen(Cases $case, EntityManagerInterface $entityManager): Response 
    { 
        if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
 
        if (!$case->getIsClosed()) { 
            $this->addFlash( 
                'danger', 
                'Case is not closed yet!' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } 
 
        $reOpened = new Cases(); 
        $reOpened 
            ->setHospital($case->getHospital()) 
            ->setDoctor($case->getDoctor()) 
            ->setPatient($case->getPatient()) 
            ->setPatientCategory($case->getPatientCategory()) 
            ->setFamilyHistory($case->getFamilyHistory() ?: '') 
            ->setMedicalHistory($case->getMedicalHistory() ?: '') 
            ->setMedicineHistory($case->getMedicalHistory() ?: '') 
            ->setCurrentDiseaseHistory($case->getCurrentDiseaseHistory() ?: '') 
            ->setDiseaseCategory($case->getDiseaseCategory()) 
            ->setPrevCase($case); 
 
        $entityManager->persist($reOpened); 
        $entityManager->flush(); 
 
        $reOpened->setMrdId('MRD-' . $case->getHospital()->getType() . '-' . date('Y') . '-' . sprintf('%010d', $reOpened->getId())); 
        $entityManager->persist($reOpened); 
        $entityManager->flush(); 
 
        $case->setIsReopened(true); 
        $entityManager->persist($case); 
        $entityManager->flush(); 
 
        $this->addFlash( 
            'success', 
            'Case re-opened successfully!' 
        ); 
 
        return $this->redirectToRoute('case_index'); 
    } 
 
    #[Route(path: '/view/{id}', name: 'case_show', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function show(Request $request, Cases $case, CaseRepository $caseRepo): Response 
    { 
        if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId() && $case->getIsopinion() !== true) { 
            $symptoms = $caseRepo->getCaseSymptoms($case->getId()); 
            $ncds = $caseRepo->getCaseNcds($case->getId()); 
            $provisionalExaminations = $caseRepo->getCaseProvisionalExaminations($case->getId()); 
            $provisionalDiagnosis = $caseRepo->getCaseProvisionalDiagnosis($case->getId()); 
            $clinicalPatterns = $caseRepo->getCaseClinicalPatterns($case->getId()); 
 
            return $this->render('cases/show.html.twig', [ 
                'case' => $case, 
                'case_tests' => $caseRepo->getCaseTests($case->getId()), 
                'case_medicines' => $caseRepo->getCaseMedicines($case->getId()), 
                'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()), 
                'referrals' => $caseRepo->getCaseReferrals($case->getId()), 
                'symptoms' => $symptoms ? implode(', ', $symptoms) : '—', 
                'ncds' => $ncds ? implode(', ', $ncds) : '—', 
                'provisional_diagnosis' => $provisionalDiagnosis ? implode(', ', $provisionalDiagnosis) : '—', 
                'provisional_examinations' => $provisionalExaminations ? implode(', ', $provisionalExaminations) : '—', 
                'clinical_patterns' => $clinicalPatterns ? implode(', ', $clinicalPatterns) : '—', 
                'case_ward_medicines' => $caseRepo->getCaseWardMedicines($case->getId()), 
                'ward_type' => $caseRepo->getWardType($case->getId()), 
                'ward_bed_num' => $caseRepo->getWardBedNum($case->getId()), 
                'discharge_note' => $caseRepo->getDischargeNote($case->getId()), 
                'history' => $caseRepo->getCaseHistory($case->getId()) 
            ]); 
        } else { 
            return $this->redirectToRoute('case_index'); 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
    } 
 
    #[Route(path: '/diagnose/{id}', name: 'case_edit', methods: ['GET', 'POST'])] 
    #[ParamDecryptor(["id"])] 
    #[Security("is_granted('ROLE_DOC') or is_granted('ROLE_CHO') or is_granted('ROLE_AYUSH') or is_granted('ROLE_DENT')")] 
    public function diagnose(Request $request, Cases $case, CaseRepository $caseRepo, EntityManagerInterface $entityManager, TBRegisterRepository $tbRegRepo, HivRegisterRepository $hivRegRepo): Response 
    { 
        if ($request->isMethod('GET') || $request->isMethod('POST') && $this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) { 
            $caseTests = $caseRepo->getCaseTests($case->getId()); 
            $radTests = $caseRepo->getCaseRadTests($case->getId()); 
            $caseMedicines = $caseRepo->getCaseMedicines($case->getId()); 
            $caseWardMedicines = $caseRepo->getCaseWardMedicines($case->getId()); 
            $form = $this->createForm(CaseType::class, $case, ['allow_extra_fields' => true, 'role' => 'doc', 'hospital' => $case->getHospital()]); 
            $form->handleRequest($request); 
            if ($case->getIsWard() && $request->isMethod('POST')) { 
                $getTotalBed = $caseRepo->getTotalBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']); 
 
                if (!empty($getTotalBed)) { 
                    $getOccupiedBedBedData = $caseRepo->getOccupiedBed($this->getUser()->getProfile()->getHospital()->getId(), $request->request->get('case')['ward']); 
                    if (!empty($getOccupiedBedBedData)) { 
                        $totalMaleBed = $getTotalBed[0]['total_male_bed']; 
                        $totalFemaleBed = $getTotalBed[0]['total_female_bed']; //1 
                        $availableMaleBad = $totalMaleBed - (int) $getOccupiedBedBedData[0]['male_occupied']; 
                        $availableFemaleBad = $totalFemaleBed - (int) $getOccupiedBedBedData[0]['female_occupied']; //0 
 
                        if ($case->getPatient()->getGender() == "Male" && (empty($totalMaleBed) || empty($availableMaleBad))) { 
                            $this->addFlash( 
                                'danger', 
                                'Male bed is not available.' 
                            ); 
                            return $this->renderForm('cases/edit.html.twig', [ 
                                'case' => $case, 
                                'form' => $form, 
                                'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()), 
                                'general_reports' => $caseRepo->getGeneralReports(), 
                                'rad_tests' => $radTests, 
                                'case_tests' => $caseTests, 
                                'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()), 
                                'case_medicines' => $caseMedicines, 
                                'case_ward_medicines' => $caseWardMedicines, 
                                'history' => $caseRepo->getCaseHistory($case->getId()) 
                            ]); 
                        } 
 
                        if ($case->getPatient()->getGender() == "Female" && (empty($totalFemaleBed) || empty($availableFemaleBad))) { 
                            $this->addFlash( 
                                'danger', 
                                'Female bed is not available.' 
                            ); 
                            return $this->renderForm('cases/edit.html.twig', [ 
                                'case' => $case, 
                                'form' => $form, 
                                'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()), 
                                'general_reports' => $caseRepo->getGeneralReports(), 
                                'rad_tests' => $radTests, 
                                'case_tests' => $caseTests, 
                                'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()), 
                                'case_medicines' => $caseMedicines, 
                                'case_ward_medicines' => $caseWardMedicines, 
                                'history' => $caseRepo->getCaseHistory($case->getId()) 
                            ]); 
                        } 
                    } 
                } else { 
                    $this->addFlash( 
                        'danger', 
                        'Bed not available.' 
                    ); 
                    return $this->renderForm('cases/edit.html.twig', [ 
                        'case' => $case, 
                        'form' => $form, 
                        'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()), 
                        'general_reports' => $caseRepo->getGeneralReports(), 
                        'rad_tests' => $radTests, 
                        'case_tests' => $caseTests, 
                        'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()), 
                        'case_medicines' => $caseMedicines, 
                        'case_ward_medicines' => $caseWardMedicines, 
                        'history' => $caseRepo->getCaseHistory($case->getId()) 
                    ]); 
                } 
            } 
            if ($form->isSubmitted() && $form->isValid()) { 
                $formData = $request->request->get('case'); 
 
                if ($caseTests || $radTests) { 
                    $case->setIsLab(true); 
                } 
 
                if ($caseMedicines) { 
                    $case->setIsMedicine(true); 
                } 
 
                if ($caseWardMedicines) { 
                    $case->setIsWard(true); 
                } 
 
                $entityManager->getConnection()->setAutoCommit(false); 
                $entityManager->beginTransaction(); 
 
                try { 
                    $entityManager->flush(); 
 
                    $history = new CaseHistory(); 
 
                    $history 
                        ->setCase($case) 
                        ->setDoctor($case->getDoctor()) 
                        ->setDiseaseCategory($case->getDiseaseCategory()) 
                        ->setLocalExamination($case->getLocalExamination()); 
 
                    if ($case->getIcd10CauseGroup()) { 
                        $history->setIcd10Group($case->getIcd10CauseGroup()->getName()); 
                    } 
 
                    if ($case->getIcd10CauseSubGroup()) { 
                        $history->setIcd10Subgroup($case->getIcd10CauseSubGroup()->getName()); 
                    } 
 
                    if ($case->getIcd10Disease()) { 
                        $history->setIcd10Diagnosis($case->getIcd10Disease()->getName()); 
                    } 
 
                    $caseRepo->deleteExistingSymptoms($case); 
                    $caseRepo->deleteExistingProvisionalExaminations($case); 
                    $caseRepo->deleteExistingProvisionalDiagnosis($case); 
 
                    if (isset($formData['clinical_patterns']) && !empty($formData['clinical_patterns'])) { 
                        $caseRepo->deleteExistingClinicalPatterns($case); 
                        $caseRepo->saveClinicalPatterns((array)$formData['clinical_patterns'], $case, $history); 
                    } 
 
                    if (isset($formData['ncds']) && !empty($formData['ncds'])) { 
                        $caseRepo->deleteExistingNcds($case); 
                        $caseRepo->saveNcds((array)$formData['ncds'], $case, $history); 
                    } 
 
                    $caseRepo->saveSymptoms((array)$formData['symptoms'], $case, $history); 
                    $caseRepo->saveProvisionalExaminations((array)$formData['provisional_examinations'], $case, $history); 
                    $caseRepo->saveProvisionalDiagnosis((array)$formData['provisional_diagnosis'], $case, $history); 
                    if ($case->getIsLab()) { 
                        $hospitalId = $case->getHospital()->getId(); 
 
                        $labTests = []; 
 
                        if (isset($formData['suggestedReports']) && count((array)$formData['suggestedReports']) > 0) { 
                            $labTests = array_merge($labTests, $formData['suggestedReports']); 
                        } 
 
                        if (isset($formData['lab_tests']) && count((array)$formData['lab_tests']) > 0) { 
                            $labTests = array_merge($labTests, $formData['lab_tests']); 
                        } 
 
                        $testIdsForHistory = $labTestIds = array_unique($labTests); 
 
                        if (count($labTestIds) > 0) { 
                            $caseRepo->saveLabTests($case->getId(), $hospitalId, $this->getUser()->getId(), $labTestIds); 
 
                            $case->setLabTestStatus('Pending'); 
                        } 
 
                        $radTests = $formData['generalReports'] ?? []; 
 
                        if (count($radTests) > 0) { 
                            $radTestData = []; 
 
                            foreach ($radTests['id'] as $radTestId) { 
                                $radTestData[] = [ 
                                    'case_id' => $case->getId(), 
                                    'lab_test_id' => $radTestId, 
                                    'instruct' => $radTests['instruct'][$radTestId], 
                                    'hospital_id' => $hospitalId, 
                                    'created_by' => $this->getUser()->getId() 
                                ]; 
                            } 
 
                            $caseRepo->saveCaseRadTests($radTestData); 
 
                            $case->setLabTestStatus('Pending'); 
 
                            $testIdsForHistory = array_merge($testIdsForHistory, $radTests['id']); 
                        } 
 
                        $testsForHistory = $caseRepo->getLabTestNames($testIdsForHistory); 
 
                        $history->setLabTests(implode(', ', $testsForHistory)); 
                    } 
 
                    if ($case->getIsMedicine()) { 
                        if (isset($formData['medicines']) && count((array)$formData['medicines']) == 6) { 
                            $medicines = $formData['medicines']; 
 
                            $medicineData = []; 
 
                            foreach ((array)$medicines['id'] as $medicineId) { 
                                $medicineData[] = [ 
                                    'case_id' => $case->getId(), 
                                    'medicine_id' => $medicineId, 
                                    'medicine_type' => $medicines['type'][$medicineId], 
                                    'dose' => $medicines['dose'][$medicineId], 
                                    'frequency' => $medicines['frequency'][$medicineId], 
                                    'num_days' => $medicines['num_days'][$medicineId], 
                                    'notes' => $medicines['patient_notes'][$medicineId], 
                                    'is_referral' => 0, 
                                    'is_opinion' => 0, 
                                    'is_rejected' => 0, 
                                    'created_by' => $this->getUser()->getId() 
                                ]; 
                            } 
 
                            $caseRepo->saveCaseMedicines($medicineData); 
 
                            $case->setCaseMedicineStatus('Pending'); 
 
                            $medsForHistory = $caseRepo->getMedicineNames($medicines['id']); 
 
                            $history->setMedicines(implode(', ', $medsForHistory)); 
                        } 
                    } 
 
                    if (($case->getIsReferral() || $case->getIsOpinion()) && $form->get('ref_doctor')->getData()) { 
                        $isOther = $form->get('ref_type')->getData() ?: 0; 
                        $isOpinion = $case->getIsOpinion(); 
                        $refDoc = $form->get('ref_doctor')->getData(); 
                        $refEmail = $form->get('ref_email')->getData(); 
                        $refNote = $form->get('ref_note')->getData(); 
 
                        $caseRef = new CaseReferral(); 
 
                        $caseRef 
                            ->setCase($case) 
                            ->setIsOther($isOther) 
                            ->setIsOpinion($isOpinion) 
                            ->setDoctor($refDoc) 
                            ->setEmail($refEmail) 
                            ->setNotes($refNote); 
 
                        if ($isOther == 1) { 
                            $caseRef->setHospital($form->get('ref_center')->getData()); 
                        } else { 
                            $caseRef->setHospital($case->getHospital()); 
                        } 
 
                        $entityManager->persist($caseRef); 
                    } 
                    if ($case->getIsWard()) { 
                        $ward = $form->get('ward')->getData(); 
                        $wardBed = $case->getWardBed(); 
 
                        if (!$wardBed) { 
                            if ($ward) { 
                                $wardBed = new WardBed(); 
                                $wardBed 
                                    ->setCase($case) 
                                    ->setWard($ward) 
                                    ->setStatus('Admitted'); 
 
                                $entityManager->persist($wardBed); 
                            } 
                        } else { 
                            if ($wardBed && $ward) { 
                                $wardBed->setWard($ward); 
 
                                $entityManager->persist($wardBed); 
                            } 
                        } 
 
                        if (isset($formData['ward_medicines']) && count((array)$formData['ward_medicines']) == 6) { 
                            $wardMedicines = $formData['ward_medicines']; 
 
                            $wardMedicineData = []; 
 
                            foreach ((array)$wardMedicines['id'] as $medicineId) { 
                                $wardMedicineData[] = [ 
                                    'case_id' => $case->getId(), 
                                    'medicine_id' => $medicineId, 
                                    'medicine_type' => $wardMedicines['type'][$medicineId], 
                                    'dose' => $wardMedicines['dose'][$medicineId], 
                                    'frequency' => $wardMedicines['frequency'][$medicineId], 
                                    'num_days' => $wardMedicines['num_days'][$medicineId], 
                                    'notes' => $wardMedicines['staff_notes'][$medicineId], 
                                    'is_emergency' => 0, 
                                    'has_stock' => 0, 
                                    'created_by' => $this->getUser()->getId() 
                                ]; 
                            } 
 
                            $case->setWardMedicineStatus("Pending"); 
 
                            $caseRepo->saveCaseWardMedicines($wardMedicineData); 
 
                            $wardMedsForHistory = $caseRepo->getMedicineNames($wardMedicines['id']); 
 
                            $history->setWardMedicines(implode(', ', $wardMedsForHistory)); 
                        } 
                    } else { 
                        $ward = $form->get('ward')->getData(); 
                        $wardBed = $case->getWardBed(); 
 
                        if ($wardBed) { 
                            if ($ward) { 
                                $caseRepo->UpdateStatus($case->getId(), $ward->getId()); 
                            } 
                        } 
                    } 
                    if ($case->getIsClosed() && $case->getClosureReason() == 'Death of patient') { 
                        $patient = $case->getPatient(); 
 
                        $patient 
                            ->setIsAlive(false) 
                            ->setExpiredAt(new \DateTime()); 
 
                        $entityManager->persist($patient); 
                    } 
 
                    $entityManager->persist($history); 
 
                    $entityManager->flush(); 
 
                    if ($caseRepo->hasTB($case->getId())) { 
                        $tbReg = $tbRegRepo->findOneBy(['hospital' => $case->getHospital(), 'patient' => $case->getPatient()]); 
 
                        if (!$tbReg) { 
                            $tbReg = new TBRegister(); 
                            $tbTest = $caseRepo->getTBTestDetails($case->getId()); 
 
                            $pds = $case->getProvisionalDiagnosis()->filter(fn ($pd) => in_array($pd->getName(), ['PTB', 'RE', 'NTM'])); 
 
                            $tbReg 
                                ->setPatient($case->getPatient()) 
                                ->setLabSerialNum($tbTest['number'] ?? '-') 
                                ->setDateCollected(isset($tbTest['date_collected']) ? new \DateTime($tbTest['date_collected']) : new \DateTime()) 
                                ->setRefFacility($case->getHospital()->getName()) 
                                ->setPresumptive(isset($pds[0]) ? $pds[0]->getName() : '-') 
                                ->setPredominant($case->getCurrentDiseaseHistory()) 
                                ->setSpecimenType($tbTest['type'] ?? '-') 
                                ->setTestMethod($tbTest['method'] ?? '-') 
                                ->setResultA($tbTest['result'] ?? '-') 
                                ->setResultB('-') 
                                ->setResultADate(isset($tbTest['result_date']) ? new \DateTime($tbTest['result_date']) : new \DateTime()) 
                                ->setHospital($case->getHospital()) 
                                ->setIsDiabeties($caseRepo->hasDM($case->getId())); 
 
                            $entityManager->persist($tbReg); 
                            $entityManager->flush(); 
                        } 
                    } 
 
                    if ($caseRepo->hasHIV($case->getId())) { 
                        $hivReg = $hivRegRepo->findOneBy(['case' => $case]); 
 
                        if (!$hivReg) { 
                            $hivReg = new HivRegister(); 
 
                            $hivReg->setCase($case); 
 
                            $entityManager->persist($hivReg); 
                            $entityManager->flush(); 
                        } 
                    } 
 
                    $entityManager->commit(); 
 
                    $this->addFlash( 
                        'success', 
                        'Case updated successfully!' 
                    ); 
 
                    return $this->redirectToRoute('case_index'); 
                } catch (\Exception) { 
                    $entityManager->rollback(); 
                    $entityManager->clear(); 
 
                    $this->addFlash( 
                        'danger', 
                        'Something went wrong! Case data could not be saved. Please try again.' 
                    ); 
 
                    return $this->redirectToRoute('case_edit', ['id' => $this->encryptor->encrypt($case->getId())]); 
                } 
            } 
 
            return $this->renderForm('cases/edit.html.twig', [ 
                'case' => $case, 
                'form' => $form, 
                'opinions' => $caseRepo->getCaseExpertOpinions($case->getId()), 
                'general_reports' => $caseRepo->getGeneralReports(), 
                'rad_tests' => $radTests, 
                'case_tests' => $caseTests, 
                'essential_drugs' => $caseRepo->getEssentialDrugs($case->getHospital()->getType()), 
                'case_medicines' => $caseMedicines, 
                'case_ward_medicines' => $caseWardMedicines, 
                'history' => $caseRepo->getCaseHistory($case->getId()) 
            ]); 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
    } 
 
    #[Route(path: '/delete/{id}', name: 'case_delete', methods: ['GET']), IsGranted(data: 'ROLE_HOSP_ADMIN')] 
    #[ParamDecryptor(["id"])] 
    public function delete(Cases $case, EntityManagerInterface $entityManager): Response 
    { 
        if ($this->getUser()->getHospital()->getId() != $case->getHospital()->getId()) { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
 
        try { 
            $entityManager->remove($case); 
            $entityManager->flush(); 
 
            $this->addFlash( 
                'success', 
                'Case deleted successfully!' 
            ); 
        } catch (\Exception) { 
            $this->addFlash( 
                'danger', 
                'Something went wrong! The case could not be deleted!' 
            ); 
        } 
 
        return $this->redirectToRoute('case_index'); 
    } 
 
    #[Route(path: '/symptoms', name: 'case_symptom_json', methods: ['GET'])] 
    public function symptoms(Request $request, CaseRepository $caseRepo): JsonResponse 
    { 
        $categoryId = $request->query->get('category_id'); 
        $symptoms = $caseRepo->getSymptoms($categoryId); 
 
        return $this->json($symptoms); 
    } 
 
    #[Route(path: '/diagnosis-data', name: 'case_diagnosis_data_json', methods: ['GET'])] 
    public function clinicalPatterns(Request $request, CaseRepository $caseRepo): JsonResponse 
    { 
        $symptomIds = $request->query->get('symptom_ids'); 
 
        $data = [ 
            'clinicalPatterns' => null, 
            'provisionalExaminations' => null, 
            'provisionalDiagnosis' => null 
        ]; 
 
        if (is_array($symptomIds)) { 
            $data['clinicalPatterns'] = $caseRepo->getClinicalPatternsBySymptomId($symptomIds); 
            $data['provisionalExaminations'] = $caseRepo->getProvisionalExaminationsBySymptomId($symptomIds); 
            $data['provisionalDiagnosis'] = $caseRepo->getProvisionalDiagnosisBySymptomId($symptomIds); 
        } 
 
        return $this->json($data); 
    } 
 
    #[Route(path: '/suggested-tests', name: 'case_suggested_tests_json', methods: ['GET'])] 
    public function suggestedTests(Request $request, CaseRepository $caseRepo): JsonResponse 
    { 
        $icd10SubGroupId = $request->query->get('icd10_sub_group_id'); 
        $tests = $caseRepo->getSuggestedTests($icd10SubGroupId); 
 
        return $this->json($tests); 
    } 
 
    #[Route(path: '/suggested-advice-treatment', name: 'case_suggested_advice_treatment_json', methods: ['GET'])] 
    public function suggestedAdviceTreatment(Request $request, CaseRepository $caseRepo): JsonResponse 
    { 
        $icd10DiseaseId = $request->query->get('icd10_disease_id'); 
        $adviceTreatment = $caseRepo->getSuggestedAdviceTreatment($icd10DiseaseId); 
 
        return $this->json($adviceTreatment); 
    } 
 
    #[Route(path: '/delete-case-medicine', name: 'case_delete_case_medicine_json', methods: ['GET'])] 
    public function removeCaseMedicine(Request $request, CaseRepository $caseRepo): JsonResponse 
    { 
        $caseMedicineId = $request->query->get('case_medicine_id'); 
        $caseRepo->deleteCaseMedicine($caseMedicineId); 
 
        return $this->json(true); 
    } 
 
    #[Route(path: '/reject-case-medicine/{id}', name: 'case_reject_case_medicine', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function rejectCaseMedicine(CaseMedicine $caseMedicine, EntityManagerInterface $entityManager): Response 
    { 
        if ($this->getUser()->getHospital()->getId() != $caseMedicine->getHospital()->getId()) { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
 
        $caseMedicine->setIsRejected(true); 
 
        $entityManager->persist($caseMedicine); 
        $entityManager->flush(); 
 
        $this->addFlash( 
            'success', 
            'Medicine rejected successfully!' 
        ); 
 
        return $this->redirectToRoute('case_index'); 
    } 
 
    #[Route(path: '/delete-case-ward-medicine/{id}', name: 'case_delete_case_ward_medicine_json', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function removeCaseWardMedicine(int $id, CaseRepository $caseRepo): JsonResponse 
    { 
        $caseRepo->deleteCaseWardMedicine($id); 
 
        return $this->json(true); 
    } 
 
    #[Route(path: '/print-history/{id}', name: 'case_history_print', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function printHistory(Cases $case, CaseRepository $caseRepo) 
    { 
        return $this->render('cases/history_print.html.twig', [ 
            'case' => $case, 
            'history' => $caseRepo->getCaseHistory($case->getId()) 
        ]); 
    } 
 
    #[Route(path: '/mlc-info-letter/{id}', name: 'case_mlc_info_letter', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function mlcInfoLetter(Cases $case) 
    { 
        return $this->render('cases/mlc_info_letter.html.twig', [ 
            'case' => $case 
        ]); 
    } 
 
    /*Start :: abha verify and add context */ 
    /** 
     * LINK AND ADD CONTEXT (M1) 
     */ 
    #[Route('/abha-link-case/{id}', name: 'abha_link_case', methods: ['GET', 'POST'])] 
    #[ParamDecryptor(["id"])] 
    public function abhaLink(Cases $case, Request $request): Response 
    { 
        if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) 
        { 
            $session = $request->getSession(); 
            $patientId = $case->getPatient()->getId(); 
            $caseId = $case->getMrdId(); 
            $uhId = $case->getPatient()->getUhId(); 
            $type = $request->request->get('type'); 
 
            $session->set('patient_id', $patientId); 
            $session->set('uh_id', $uhId); 
            $session->set('case_number', $caseId); 
 
            $abhaDetail = $request->request->get('abha_details') ? $request->request->get('abha_details') : ''; 
            /* $abhaDetail = $request->request->get('abha_detail'); 
            if (!$abhaDetail || !ctype_digit($abhaDetail) || strlen($abhaDetail) != 6) { 
                $this->addFlash( 
                    'danger', 
                    'Please enter valid abha number/abha address.' 
                ); 
            } */ 
            $readOnly = ''; 
            if ($abhaDetail != '') { 
                $readOnly = "readonly"; 
            } 
            return $this->render('cases/link_step1.html.twig', [ 
                'type' => $type, 
                'case' => $case, 
                'readOnly' => $readOnly, 
                'abhaDetail' => $abhaDetail, 
            ]); 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
    } 
 
    /** 
     * LINK AND ADD CONTEXT (M1) 
     */ 
    #[Route('/post-abha-link', name: 'post_abha_link_case', methods: ['GET', 'POST'])] 
    public function postAbhaLink(Request $request, PatientRepository $patientRepo): Response 
    { 
        $session = $request->getSession(); 
        if ($request->isMethod('POST')) { 
            $healthAddress = $request->request->get('abha_details'); 
 
            if (!$healthAddress) { 
                return $this->redirectToRoute('case_index'); 
            } 
 
            //TODO :: health address store in session 
            $session->set('health_address', $healthAddress); 
 
            //define hip code and get code from hospital table 
            $hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode(); 
            //try { 
            $payload = [ 
                'id' => $healthAddress, 
                'hip_id' => $hipCode 
            ]; 
            $url = 'https://dev2-abdm.7mantra.in/data-link/fetch-modes'; 
            $patientRepo->insertPayload($payload, $url); 
 
            $client = HttpClient::create(); 
            $response = $client->request('POST', $url, [ 
                'headers' => [ 
                    'Content-Type' => 'application/json', 
                ], 
                'json' => $payload 
            ]); 
            $statusCode = $response->getStatusCode(); 
            $content = json_decode($response->getContent(), true); 
            if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') { 
                $message = $content['message']; 
                if ($statusCode == '422') { 
                    $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered'; 
                } 
                $this->addFlash( 
                    'danger', 
                    $message 
                ); 
                return $this->redirectToRoute('fetch_mode'); 
            } elseif ($statusCode == '202') { 
                if (isset($content['message'])) { 
                    $this->addFlash( 
                        'danger', 
                        $content['message'] 
                    ); 
 
                    return $this->redirectToRoute('fetch_mode'); 
                } 
 
                return $this->render('cases/fetch-modes.html.twig', [ 
                    'type' => 'case_diagnose', 
                    'modesArr' => $content, 
                    'health_address' => $healthAddress 
                ]); 
            } else { 
                return $this->redirectToRoute('case_index'); // redirect to search abha 
            } 
        } 
    } 
 
    /** 
     * LINK HEALTH RECORD FETCH MODE (M2) 
     */ 
    #[Route(path: '/post-fetch-modes', name: 'post_fetch_modes_case', methods: ['GET', 'POST'])] 
    public function postFetchModes(Request $request, PatientRepository $patientRepo): Response 
    { 
        $fetchMode = $request->request->get('fetch_mode'); 
        $healthAddress = $request->request->get('health_address'); 
        $type = $request->request->get('type'); 
 
        if (!$fetchMode || !$healthAddress || !$type) { 
            $this->addFlash( 
                'danger', 
                'please enter valid details' 
            ); 
            return $this->render('cases/fetch-modes.html.twig', [ 
                'modes' => $fetchMode, 
                'modesArr' => $type, 
                'health_address' => $healthAddress, 
            ]); 
        } 
        $session = $request->getSession(); 
        $patientId = $session->get('patient_id'); 
        $patientDetail = $patientRepo->getPatientById($patientId); 
        $patientArr['name'] = isset($patientDetail[0]) && $patientDetail[0]['first_name'] . ' ' . $patientDetail[0]['middle_name'] . ' ' . $patientDetail[0]['last_name'] ? $patientDetail[0]['first_name'] . ' ' . $patientDetail[0]['middle_name'] . ' ' . $patientDetail[0]['last_name'] : ''; 
        $patientArr['gender'] = isset($patientDetail[0]) && $patientDetail[0]['gender'] ? $patientDetail[0]['gender'] : ''; 
        $patientArr['dob'] = isset($patientDetail[0]) && $patientDetail[0]['dob'] ? $patientDetail[0]['dob'] : ''; 
        $patientArr['mobile'] = isset($patientDetail[0]) && $patientDetail[0]['mobile'] ? $patientDetail[0]['mobile'] : ''; 
        //try { 
        //define hip code and get code from hospital table 
        $hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode(); 
        $payload = [ 
            'id' => $healthAddress, 
            'hip_id' => $hipCode, 
            'auth_mode' => $fetchMode, 
        ]; 
 
        $url = 'https://dev2-abdm.7mantra.in/data-link/init'; 
        $patientRepo->insertPayload($payload, $url); 
 
        $client = HttpClient::create(); 
        $header = [ 
            'Content-Type' => 'application/json', 
        ]; 
        $response = $client->request('POST', $url, [ 
            'headers' => $header, 
            'json' => $payload 
        ]); 
        $statusCode = $response->getStatusCode(); 
        $content = json_decode($response->getContent(), true); 
 
        if ($statusCode == '202') { //if api success, get tnx id 
            if (isset($content['message'])) { 
                $this->addFlash( 
                    'danger', 
                    $content['message'] 
                ); 
 
                return $this->render('cases/fetch-modes.html.twig', [ 
                    'modes' => $fetchMode, 
                    'modesArr' => $type, 
                    'health_address' => $healthAddress, 
                ]); 
            } 
 
            $txnId = isset($content['txn_id']) ? $content['txn_id'] : ''; 
 
            return $this->render('cases/verify_data_link.html.twig', [ 
                'modes' => $fetchMode, 
                'type' => $type, 
                'txn_id' => $txnId, 
                'health_address' => $healthAddress, 
                'patientArr' => $patientArr 
            ]); 
        } elseif ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') { 
            //if api get error 
            $message = $content['message']; 
            if ($statusCode == '422') { 
                $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered'; 
            } 
 
            $this->addFlash( 
                'danger', 
                $message 
            ); 
 
            return $this->render('cases/fetch-modes.html.twig', [ 
                'modes' => $fetchMode, 
                'modesArr' => $type, 
                'health_address' => $healthAddress, 
            ]); 
            //return $this->redirectToRoute('patient_search_with_abha' 
        } else { 
            return $this->redirectToRoute('case_index'); 
        } 
        /* } catch (\Throwable $th) { 
            $this->addFlash( 
                'danger', 
                'Something went wrong please try again.' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } */ 
    } 
 
    /** 
     * LINK HEALTH RECORD VERIFY DETAILS (M2) 
     */ 
    #[Route(path: '/link-verify-details', name: 'link_verify_details', methods: ['GET', 'POST'])] 
    public function linkVerifyDetails(Request $request, PatientRepository $patientRepo): Response 
    { 
        $session = $request->getSession(); 
        $modes = $request->request->get('modes'); 
        $healthAddress = $request->request->get('health_address'); 
        $name = $request->request->get('name'); 
        $gender = $request->request->get('gender'); 
        $dob = $request->request->get('dob'); 
        $mobile = $request->request->get('mobile'); 
        $type = $request->request->get('type'); 
        $txnId = $request->request->get('txn_id'); 
        $auth_code = $request->request->get('otp'); 
 
        if (!$healthAddress || !$type || !$txnId || !$modes) { 
            $this->addFlash( 
                'danger', 
                'please enter valid details' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } else if (($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') && !$auth_code && strlen($auth_code) != 6) { 
            $this->addFlash( 
                'danger', 
                'please enter valid details' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } else if ($modes == 'DEMOGRAPHICS' && (!$name || !$gender || !$dob)) { 
            $this->addFlash( 
                'danger', 
                'please enter valid details' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } 
 
        if ($modes == 'MOBILE_OTP' || $modes == 'AADHAAR_OTP') { 
            $payload = [ 
                'transaction_id' => $txnId, 
                'modes' => $modes, 
                'auth_code' => $auth_code 
            ]; 
        } else { 
            $payload = [ 
                'transaction_id' => $txnId, 
                'modes' => $modes, 
                'name' => $name, 
                'gender' => $gender, 
                'dob' => $dob, 
                'mobile' => $mobile, 
            ]; 
        } 
 
        //dump(json_encode($payload)); 
        //try { 
        $header = [ 
            'Content-Type' => 'application/json', 
        ]; 
 
        $url = 'https://dev2-abdm.7mantra.in/data-link/confirm'; 
        $patientRepo->insertPayload($payload, $url); 
 
        $client = HttpClient::create(); 
        $response = $client->request('POST', $url, [ 
            'headers' => $header, 
            'json' => $payload 
        ]); 
        $statusCode = $response->getStatusCode(); 
        $content = json_decode($response->getContent(), true); 
 
        if ($statusCode == '400' || $statusCode == '401' || $statusCode == '422' || $statusCode == '500') { 
            $message = $content['message']; 
            if ($statusCode == '422') { 
                $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered'; 
            } 
 
            $this->addFlash( 
                'danger', 
                $message 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } else if ($statusCode == '202') { 
            if (isset($content['message']) && empty($content)) { // changes || 
                $this->addFlash( 
                    'danger', 
                    $content['message'] 
                ); 
                return $this->redirectToRoute('case_index'); 
            } 
            $contentArr['token'] = $content['token']; 
            $contentArr['firstName'] = $content['first_name']; 
            $contentArr['middleName'] = $content['middle_name']; 
            $contentArr['lastName'] = $content['last_name']; 
            //$contentArr['yearOfBirth'] = date('Y-m-d', strtotime($content['dob'])); 
            $contentArr['dob'] = date('Y-m-d', strtotime($content['dob'])); 
            $contentArr['gender'] = $content['gender']; 
            $contentArr['mobile'] = isset($content['identifiers']['mobile']) ? $content['identifiers']['mobile'] : ''; 
            $contentArr['healthIdNumber'] = isset($content['identifiers']['health_number']) ? $content['identifiers']['health_number'] : ''; 
            $contentArr['healthIdAddress'] = $content['id']; 
 
            if ($type == 'case_diagnose') { 
                $patientId = $session->get('patient_id'); // get patient id in session 
 
                //force fully update details and redirect to relative patient 
                $contextStatus = ''; 
                if (isset($content['token']) && !empty($content['token'])) { 
                    if (empty($contentArr['healthIdNumber']) || empty($contentArr['healthIdAddress'])) { 
                        $getTokenData = (array) json_decode(base64_decode(str_replace('_', '/', str_replace('-', '+', explode('.', $content['token'])[1])))); 
                        $contentArr['healthIdNumber'] = isset($getTokenData['healthIdNumber']) ? $content['healthIdNumber'] : ''; 
                        $contentArr['healthIdAddress'] = isset($getTokenData['healthId']) ? $content['healthId'] : ''; 
                    } 
                    $patientRepo->updateAbhaDetails($contentArr, $patientId); 
                    //TODO :: All value set dynamic, case and patient table 
                    $patientReference = $session->get('uh_id'); 
                    $caseNumber = $session->get('case_number'); 
                    // TODO : set payload dynamic {type= case,id=caseId,token=token} 
                    $careContext[] = ['referenceNumber' => $caseNumber, 'display' => 'Case Care Context']; 
                    // $type = 'OPConsultation'; 
                    $type = 'Prescription'; 
                    $patientDisplay = 'patient display'; 
                    //define hip code and get code from hospital table 
                    $hipId = $this->getUser()->getProfile()->getHospital()->getHIPCode(); 
                    $addContextPayload = [ 
                        'accessToken' => $content['token'], 
                        'patientReference' => $patientReference, 
                        'display' => $patientDisplay, 
                        'careContexts' => $careContext, 
                        'healthAddress' => $healthAddress, 
                        'type' => $type, 
                        'hip_id' => $hipId 
                    ]; 
                       
                    $url = 'https://dev2-abdm.7mantra.in/m2/add-context'; 
                    $patientRepo->insertPayload($addContextPayload, $url); 
 
                    $client = HttpClient::create(); 
                    $contextResponse = $client->request('POST', $url, [ 
                        'headers' => $header, 
                        'json' => $addContextPayload 
                    ]); 
                    //dump($contextResponse); 
                    $contextStatus = $contextResponse->getStatusCode(); 
                } 
 
                if ($contextStatus ==  '202') { 
                    $this->addFlash( 
                        'success', 
                        'Health data link successfully.' 
                    ); 
                } else if ($contextStatus ==  '400') { 
                    $this->addFlash( 
                        'danger', 
                        'Bad request.' 
                    ); 
                } else if ($contextStatus ==  '422') { 
                    $this->addFlash( 
                        'danger', 
                        'Some of the Care Contexts are already linked, please remove the linked Care Contexts.' 
                    ); 
                } else { 
                    $this->addFlash( 
                        'danger', 
                        'Something went wrong! Please try again 1!' 
                    ); 
                } 
                $session->remove('patient_id'); 
                $session->remove('health_address'); 
                $session->remove('uh_id'); 
                $session->remove('case_number'); 
 
                return $this->redirectToRoute('case_index'); 
            } 
        } else { 
            $this->addFlash( 
                'danger', 
                'Something went wrong. Please try again. 2' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } 
 
        /* } catch (\Throwable $th) { 
            $this->addFlash( 
                'danger', 
                'Something went wrong please try again.' 
            ); 
 
            return $this->redirectToRoute('case_index'); 
        } */ 
    } 
 
    /*END :: abha verify and add context */ 
 
    /** 
     * LINK HEALTH RECORD (M2) 
     */ 
 
    #[Route(path: '/data-link-fetch/{id}', name: 'data_link_fetch', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function dataLinkFetch(Cases $case, Request $request, PatientRepository $patientRepo): Response 
    { 
        if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) { 
            //TODO :: {{base url}}/v0.5/users/auth/init call this api 
            //TODO :: get health address from patient table 
            //$case->getPatient()->getMobile(); 
            $healthAddress = $case->getPatient()->getHealthAddress(); 
            if (!$healthAddress) { 
                $this->addFlash( 
                    'danger', 
                    'Invalid request.' 
                ); 
                return $this->redirectToRoute('case_index'); 
            } 
 
            $patientId = $case->getPatient()->getId(); 
            $caseId = $case->getMrdId(); 
            $session = $request->getSession(); 
            $uhId = $case->getPatient()->getUhId(); 
            $session->set('patient_id', $patientId); 
            $session->set('uh_id', $uhId); 
            // get Case id in store session 
            $session->set('case_number', $caseId); 
 
            //TODO :: health address store in session 
            $session->set('health_address', $healthAddress); 
 
            //define hip code and get code from hospital table 
            $hipCode = $this->getUser()->getProfile()->getHospital()->getHIPCode(); 
            //try { 
            $payload = [ 
                'id' => $healthAddress, 
                'hip_id' => $hipCode 
            ]; 
            //dump(json_encode($payload)); 
            //  dump($payload); 
            $url = 'https://dev2-abdm.7mantra.in/data-link/fetch-modes'; 
            $patientRepo->insertPayload($payload, $url); 
 
            $client = HttpClient::create(); 
            $response = $client->request('POST', $url, [ 
                'headers' => [ 
                    'Content-Type' => 'application/json', 
                ], 
                'json' => $payload 
            ]); 
             
            $statusCode = $response->getStatusCode(); 
            // dump($statusCode); 
            $content = json_decode($response->getContent(), true); 
            if ($statusCode == '400' || $statusCode == '500' || $statusCode == '401' || $statusCode == '422') { 
                $message = $content['message']; 
                if ($statusCode == '422') { 
                    $message = isset($content['message']) ? $content['message'] : 'Unable to process the current request due to incorrect data entered'; 
                } 
                $this->addFlash( 
                    'danger', 
                    $message 
                ); 
                return $this->redirectToRoute('fetch_mode'); 
            } elseif ($statusCode == '202') { 
                if (isset($content['message'])) { 
                    $this->addFlash( 
                        'danger', 
                        $content['message'] 
                    ); 
 
                    return $this->redirectToRoute('fetch_mode'); 
                } 
                if (empty($content)) { 
                    return $this->redirectToRoute('case_index'); 
                } 
                return $this->render('cases/fetch-modes.html.twig', [ 
                    'type' => 'case_diagnose', 
                    'modesArr' => $content, 
                    'health_address' => $healthAddress 
                ]); 
            } else { 
                return $this->redirectToRoute('case_index'); // redirect to search abha 
            } 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
    } 
 
    /** 
     * M2 SMS NOTIFY 
     */ 
    #[Route(path: '/patient-notify/{id}', name: 'patient_notify', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function patientNotify(Cases $case, PatientRepository $patientRepo): Response 
    { 
        if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) { 
            //TODO :: get mobile number related patient 
            //TODO :: {{base url}}/v0.5/users/auth/init call this api 
            //TODO :: add try catch 
            $patientMobileNumber = $case->getPatient()->getMobile(); 
            if (!$patientMobileNumber) { 
                $this->addFlash( 
                    'danger', 
                    'Invalid request.' 
                ); 
 
                return $this->redirectToRoute('case_index'); 
            } 
 
            $payload = [ 
                'mobile_number' => $patientMobileNumber, 
                'hip_id' => $this->getUser()->getProfile()->getHospital()->getHIPCode(), 
                'hip_name' => $this->getUser()->getProfile()->getHospital()->getHIPName() 
            ]; 
          //  dump($payload); 
            $url = 'https://dev2-abdm.7mantra.in/m2/sms-notify2'; 
            $patientRepo->insertPayload($payload, $url); 
              
            $client = HttpClient::create(); 
            $response = $client->request('POST', $url, [ 
                'headers' => [ 
                    'Content-Type' => 'application/json' 
                ], 
                'json' => $payload 
            ]); 
 
            $status = $response->getStatusCode(); 
 
            if ($status ==  '202') { 
                $this->addFlash( 
                    'success', 
                    'Message sent successfully.' 
                ); 
            } else if ($status ==  '400') { 
                $this->addFlash( 
                    'danger', 
                    'Mobile number required.' 
                ); 
            } else { 
                $this->addFlash( 
                    'danger', 
                    'Something went wrong! Please try again!' 
                ); 
            } 
 
            return $this->redirectToRoute('case_index'); 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } 
    } 
 
    /** 
     * CONSENT LIST (M3) 
     */ 
    #[Route(path: '/consent/{id}', name: 'consent', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function consent(Request $request, Abha $abha): Response 
    { 
        // cross site script 
        $id = $this->encryptor->encrypt($request->attributes->get('id')); 
        $arrData = $abha->getConsentList(); 
        //dd($arrData); 
        $uri = $this->generateUrl('consent_req_form', ['id' => $id]); 
        return $this->render('abha/consent.html.twig', [ 
            'consents' => $arrData, 
            'form_url' => $uri, 
            'data_request' => 'data_request', 
            'view_data' => 'view_data' 
        ]); 
    } 
 
    /** 
     * CONSENT REQUEST FORM (M3) 
     */ 
    #[Route(path: '/consent-request/{id}', name: 'consent_req_form', methods: ['GET'])] 
    #[ParamDecryptor(["id"])] 
    public function consentForm(Request $request, Abha $abha): Response 
    { 
        //cross site script 
        return $this->render('abha/consent_form.html.twig', [ 
            'post_form_url' => 'request_init', 
            'patient_find_url' => 'patient_find', 
            'id' => $this->encryptor->encrypt($request->attributes->get('id')) 
        ]); 
    } 
 
    /** 
     * M3 SUBMIT CONSENT FORM 
     */ 
    #[Route(path: '/consent-request-init', name: 'request_init', methods: ['GET', 'POST'])] 
    public function requestInit(Request $request, Abha $abha): Response 
    { 
        /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) { 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } */ 
        // $id = $this->encryptor->encrypt($request->attributes->get('id')); 
        // $uri = $this->generateUrl('consent', ['id' => $id]); 
 
        $reqData = $request->request->all(); 
        $reqData['hiuParName'] = $this->getUser()->getProfile()->getFirstName() . ' ' . $this->getUser()->getProfile()->getLastName(); // practitioner name 
        $reqData['hiuId'] = $this->getUser()->getProfile()->getHospital()->getHIUCode(); 
        $request = $abha->requestInt($reqData); 
        if ($request) { 
            // return $this->redirectToRoute('consent', ['id' => $reqData['health_id'].'abdm']); 
            return $this->redirectToRoute('consent', ['id' => ($reqData['id'])]); 
        } else { 
            return $this->render('abha/consent_form.html.twig', [ 
                'post_form_url' => 'request_init', 
                'patient_find_url' => 'patient_find' 
            ]); 
        } 
    } 
 
    /** 
     * M3 REQUEST FOR DATA FROM HIP 
     */ 
    #[Route(path: '/data-request/{id}', name: 'data_request', methods: ['GET', 'POST'])] 
    #[ParamDecryptor(["id"])] 
    public function dataRequest(Request $request, Abha $abha): Response 
    { 
        /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) { 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } */ 
 
        $id = $request->attributes->get('id'); 
        $response = $abha->getDataRequest($id); 
 
        // dump($id); 
        // dd($response); 
        $id = $this->encryptor->encrypt($request->attributes->get('id')); 
 
        return $this->redirectToRoute('consent', ['id' => $id]); 
    } 
 
    /** 
     * M3 VIEW CONSENT DATA 
     */ 
    #[Route(path: '/view-data/{id}', name: 'view_data', methods: ['GET', 'POST'])] 
    #[ParamDecryptor(["id"])] 
    public function viewRequest(Request $request, Abha $abha): Response 
    { 
        /* if ($this->getUser()->getHospital()->getId() == $case->getHospital()->getId()) { 
        } else { 
            return $this->render('bundles/TwigBundle/Exception/errorAccess.html.twig'); 
        } */ 
         
        $id = $request->attributes->get('id'); 
        // dd($id); 
        $response = $abha->getViewData($id); 
            // dd($response[1]); 
            //  dd($response[1]['htmlFinalArr']); 
            //  dd(base64_encode($response[1]['pdf'])); 
        $id = $this->encryptor->encrypt($request->attributes->get('id')); 
        if ($response[1]) { 
            $uri = $this->generateUrl('consent', ['id' => $id]); 
            // dd($uri); 
            return $this->render('abha/view_consent.html.twig', [ 
                'data' => $response[1], 
                'back_url' => $uri, 
         'htmlFinalArr' => $response[1]['htmlFinalArr'] ?? [], 
        'pdfBase64' => base64_encode($response[1]['pdf'] ?? ''), 
            ]); 
        } else { 
            return $this->redirectToRoute('consent', ['id' => $id]); 
        } 
    } 
 
    /** 
     * M3 PATIENT FIND IN CONSENT REQUEST 
     */ 
    #[Route('/patient-find', name: 'patient_find', methods: ['GET', 'POST'])] 
    public function patientFind(Request $request, Abha $abha): Response 
    { 
        $healthId = $request->request->get('health_id'); 
        if (!$healthId && strlen($healthId) <= 6) { 
            return $this->json('invalid'); 
        } 
 
        $name = $abha->patientFind($healthId); 
 
        return $this->json($name); 
    } 
 
    public function getAccessToken() 
    { 
        $client = HttpClient::create(); 
        $response = $client->request('POST', 'https://apis.abdm.gov.in/hiecm/gateway/v0.5/sessions', [ 
            'headers' => [ 
                'Content-Type' => 'application/json' 
            ], 
            'json' => [ 
                'clientId' => $_ENV['CLIENT_ID'], 
                'clientSecret' => $_ENV['CLIENT_SECRET'] 
            ] 
        ]); 
        $decodedPayload = $response->toArray(); 
 
        return 'Bearer ' . $decodedPayload['accessToken']; 
    } 
 
    function GUID() 
    { 
        if (function_exists('com_create_guid') === true) { 
            return trim(com_create_guid(), '{}'); 
        } 
 
        return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)); 
    } 
}