HEX
Server: nginx/1.24.0
System: Linux DGT-WORDPRESS-VM-SERVER 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/FamilyTreeController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\UserMedicalhistory;
use App\FamilyTree;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\UserIdRequest;
use Illuminate\Support\Carbon;
use DB;
use Auth;

class FamilyTreeController extends Controller
{
    public function index(Request $request)
    {

    }

    public function show(UserIdRequest $request)
    {
        try {

            $tree = FamilyTree::where('user_id', $request->user_id)->first();
            if($tree) {

                return self::sentResponse(200, $tree, __('digimed_validation.success_response.data_fetch_success'));
            } else {
                return self::sentResponse(201, [], __('digimed_validation.error_response.user_not_found'));
            }

        } catch (Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function store(UserIdRequest $request)
    {
        try {

            $tree = FamilyTree::where('user_id', $request->user_id)->first();
            if($tree) {
                $tree->updated_by = auth()->user()->id;
            } else {
                $tree = new FamilyTree();
                $tree->user_id = $request->user_id;
                $tree->created_by = auth()->user()->id;
            }

            $tree->tree_data = $request->tree_data;
            $tree->save();

            return self::sentResponse(200, [], __('digimed_validation.success_response.data_store_success'));

        } catch (Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function updateStatus(UserIdRequest $request)
    {
        try {

            $tree = FamilyTree::where('user_id', $request->user_id)->first();
            if($tree) {

                $tree->updated_by = auth()->user()->id;
                $tree->status = $request->status;
                $tree->save();

                return self::sentResponse(200, [], __('digimed_validation.success_response.data_update_success'));
            } else {
                return self::sentResponse(404, [], __('digimed_validation.error_response.user_not_found'));
            }
            
        } catch (Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function familyTree(Request $request)
    {
        try {
            $rules = [               
                // 'medical_history_id' => 'required',
                'user_id' => 'required',

            ];
            $messages = [
                // 'medical_history_id.required' => __('digimed_validation.form_validation_error.medical_history_id_req'),
                'user_id.required'       => __('digimed_validation.form_validation_error.user_id_req'),
            ];
            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            } 

            DB::beginTransaction();
            $user_id = $request->user_id;
            // $medical_history_id = $request->medical_history_id;

            $medicalHistory = UserMedicalhistory::where('user_id',$user_id)->first()->toArray();
            if(!$medicalHistory) {
                return self::sentResponse(404, [], __('digimed_validation.form_validation_error.medical_history_not_found'));
            }
            $data = json_decode($medicalHistory['medical_history'], true);

            $familyTree = $this->createFamilyTree($data);

            return self::sentResponse(200, ['family_tree' => $familyTree], __('digimed_validation.success_response.family_tree_fetch_success'));
           

        } catch (Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    //family tree web
    public function familyTreeWeb(Request $request)
    {
        try {
            $rules = [               
                'user_id' => 'required',
            ];
            $messages = [
                'user_id.in'=> __('digimed_validation.form_validation_error.user_id_req'),
            ];
            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            } 

            DB::beginTransaction();
            $user_id = $request->user_id;

            $medicalHistory = UserMedicalhistory::where('user_id',$user_id)->first();
            $familyTree = $medicalHistory->toArray();
            if($medicalHistory){
                $data['display_status'] = $medicalHistory['display_status'];
                $data['medical_history_id'] = $medicalHistory['id'];
            } else{
                $data['display_status'] = 2;
            }
            if(!$medicalHistory) {
                return response()->json([
                    'code' => '404',
                    'message' => __('digimed_validation.form_validation_error.medical_history_not_found'),
                ], 404);
            }
            $data['familyTree'] = json_decode($familyTree['medical_history'], true);
          
            return self::sentResponse(200, ['family_tree' => $data], __('digimed_validation.success_response.family_tree_fetch_success'));

        } catch (Exception | Throwable | QueryException $e) {
            DB::rollback();
            return self::sentResponse(500, [], $e->getMessage());
        }
    }


    public function statusUpdate(Request $request)
    {
        try{
            $rules = [               
                'medical_history_id' => 'required',
                'user_id' => 'required',
                'display_status' => 'required|in:0,1',

            ];
            $messages = [
                'medical_history_id.required' => __('digimed_validation.form_validation_error.medical_history_id_req'),
                'user_id.required'       => __('digimed_validation.form_validation_error.user_id_req'),
                'display_status.required' => __('digimed_validation.form_validation_error.display_status_required'), 
            ];
            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            } 
          
            $userMedicalHistory = UserMedicalhistory::find($request->medical_history_id);
        
            if(!$userMedicalHistory) {
                return response()->json([
                    'code' => '404',
                    'message' => __('digimed_validation.form_validation_error.medical_history_not_found'),
                ], 404);
            }
           
            $userMedicalHistory->display_status = $request->display_status;
            $userMedicalHistory->reviewed_by = Auth::id();
          
            if(  $userMedicalHistory->save()){
                return self::sentResponse(200, [], __('digimed_validation.success_response.medical_history_success'));
            } else{
                return response()->json([
                    'code' => '404',
                    'message' => __('digimed_validation.form_validation_error.medical_history_status_not_update'),
                ], 404);
            }

        } catch (Exception | Throwable | QueryException $e) {
           
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    

    //based on level
    // private function createFamilyTree($data)
    // {
    //     $familyTree = [
    //         'level_1' => [],
    //         'level_2' => [],
    //         'level_3' => [],
    //         'level_4' => []
    //     ];

    //     // Level 1
    //     if (isset($data['you']) && !empty($data['you'])) {
    //         $familyTree['level_1'][] = [
    //             'relation' => 'You',
    //             'details' => $data['you'][0]
    //         ];
    //     }

    //     // Level 2
    //     if (isset($data['mother']) && !empty($data['mother'])) {
    //         $familyTree['level_2'][] = [
    //             'relation' => 'Mother',
    //             'details' => $data['mother'][0]
    //         ];
    //     }
    //     if (isset($data['father']) && !empty($data['father'])) {
    //         $familyTree['level_2'][] = [
    //             'relation' => 'Father',
    //             'details' => $data['father'][0]
    //         ];
    //     }

    //     // Level 3
    //     if (isset($data['siblings']) && !empty($data['siblings'])) {
    //         foreach ($data['siblings'] as $sibling) {
    //             $familyTree['level_3'][] = [
    //                 'relation' => 'Sibling',
    //                 'details' => $sibling
    //             ];
    //         }
    //     }
    //     if (isset($data['sisters']) && !empty($data['sisters'])) {
    //         foreach ($data['sisters'] as $sister) {
    //             $familyTree['level_3'][] = [
    //                 'relation' => 'Sister',
    //                 'details' => $sister
    //             ];
    //         }
    //     }
    //     if (isset($data['wife']) && !empty($data['wife'])) {
    //         $familyTree['level_3'][] = [
    //             'relation' => 'Wife',
    //             'details' => $data['wife'][0]
    //         ];
    //     }
    //     if (isset($data['husband']) && !empty($data['husband'])) {
    //         $familyTree['level_3'][] = [
    //             'relation' => 'Husband',
    //             'details' => $data['husband'][0]
    //         ];
    //     }

    //     return $familyTree;
    // }

    //based on parent children


    private function createFamilyTree($inputData)
    {
        function mapMember($name, $attributes, $children = [])
        {
            return [
                'name' => $name,
                'attributes' => $attributes,
                'children' => $children,
            ];
        }

        // Utility function to calculate age from DOB
        function calculateAge($dob)
        {
            return Carbon::now()->diffInYears(Carbon::parse($dob));
        }    
        // Build the family tree dynamically based on input
        $familyTree = mapMember(
            'Grandfather',
            [
                'age' => calculateAge($inputData['grand_father'][0]['dob']),
                'dob' => $inputData['grand_father'][0]['dob'],
                'common_disease' => $inputData['grand_father'][0]['common_disease'] ?? null,
                'ethnicity' => $inputData['grand_father'][0]['ethnicity'] ?? null,
            ],
            [
                mapMember(
                    'Father',
                    [
                        'age' => calculateAge($inputData['father'][0]['dob']),
                        'dob' => $inputData['father'][0]['dob'],
                        'common_disease' => $inputData['father'][0]['common_disease'] ?? null,
                        'ethnicity' => $inputData['father'][0]['ethnicity'] ?? null,
                    ],
                    [
                        mapMember(
                            'You',
                            [
                                'preventive_scan' => $inputData['you'][0]['preventive_scan'], // Add dynamic calculation if needed
                                'hereditary_disease' => $inputData['you'][0]['hereditary_disease'],
                                'chronic_diseases' => $inputData['you'][0]['chronic_diseases'], // Add dynamic calculation if needed
                                'disease_name' => $inputData['you'][0]['disease_name'], 
                                'common_disease' => $inputData['you'][0]['common_disease'], // Add dynamic calculation if needed
                                'isCancer_diagnised' => $inputData['you'][0]['isCancer_diagnised'], 

                                'famiy_diagonised' => $inputData['you'][0]['famiy_diagonised'], // Add dynamic calculation if needed
                                'cancer_type' => $inputData['you'][0]['cancer_type'],
                                'heredity_carrier' => $inputData['you'][0]['heredity_carrier'], // Add dynamic calculation if needed
                                'carrier_disease_name' => $inputData['you'][0]['carrier_disease_name'], 
                                'is_geneticVariant' => $inputData['you'][0]['is_geneticVariant'], // Add dynamic calculation if needed
                                'genetic_variant' => $inputData['you'][0]['genetic_variant'], 
                            ],
                            [
                                mapMember(
                                    'wife',
                                    [
                                        'age' => 3, // Add dynamic calculation if needed
                                        'dob' => '2021-11-20',
                                        'job' => 'Toddler',
                                    ]
                                ),
                               
                            ]
                        ),
                    ]
                ),
                mapMember(
                    'Grandmother',
                    [
                        'age' => calculateAge($inputData['grand_mother'][0]['dob']),
                        'dob' => $inputData['grand_mother'][0]['dob'],
                        'common_disease' => $inputData['grand_mother'][0]['common_disease'] ?? null,
                        'ethnicity' => $inputData['grand_mother'][0]['ethnicity'] ?? null,
                    ]
                ),
            ]
        );
        return $familyTree;
    }  
}