<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Admin;
use App\Models\HcpEducation;
use App\Models\HcpLicense;
use App\Models\Hcp;
use App\Models\Device;
use App\Models\NearLab;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
use Yajra\DataTables\DataTables;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Crypt;

class AdminController extends Controller
{
   
   public function dashboard(){
    return view('admin.index');
   } 

   public function login(){
    return view('admin.login');
   } 
   public function register(){


    return view('admin.register');
   }   
  public function create(Request $request)
    {
    
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:admins,email|regex:/\.[a-z]{2,}$/i',
            'password' => 'required|string|min:8',
        ]);
       
        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();

        }
        try {
            $admin = Admin::create([
                'name' => $request->input('name'),
                'email' => $request->input('email'),
                'password' => Hash::make($request->input('password')),
            ]);
            if($admin){
            Log::info('Admin creation successful.');
            return redirect()->route('admin.login')->with('success', 'Admin created successfully!');
            }
        } catch (\Throwable $th) {
            Log::error('Error creating admin: ' . $th->getMessage());
            return redirect()->back()->with('error', 'An error occurred while creating the admin.');
        }
    }
    public function signin(Request $request)

    { 
     $validator = Validator::make($request->all(), [
            'email' => 'required|email||regex:/\.[a-z]{2,}$/i',
            'password' => 'required',
        ]);
 
        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
            
        }
        try {
           $checkAdmin = Admin::where('email', $request->email)->first();
            if(!$checkAdmin){
                return redirect()->back()->withErrors(['email' => 'This email is not registered.'])->withInput();   
            } 
            

            $credentials = $validator->validated();
            if (Auth::guard('admin')->attempt([
                'email' => $credentials['email'],
                'password' => $credentials['password'],
            ])) {

            Log::info('Admin login successful.');
           return redirect()->route('admin.dashboard')->with('success', 'Admin login successfully!'); 
            }
            else {
            return redirect()->back()->withErrors(['password' => 'The password you entered is incorrect.'])->withInput();
        }
        } catch (\Throwable $th) {
            Log::error('Error login admin: ' . $th->getMessage());
            return redirect()->back()->with('error', 'An error occurred while login the admin.');
        }
    }
    public function logout(Request $request)

    { 
        Auth::guard('admin')->logout(); 
        session()->invalidate();
        session()->regenerateToken();
        return redirect('/admin/login');   

    }

    public function hcp(){
        
        return view('admin.hcp.index');
    } 
    
   public function device(){
        
        return view('admin.devices.devices');
    } 

    public function hcpdata(){
        
        $hcps = Hcp::all();
   
        return DataTables::of($hcps)
          ->addColumn('action', function($hcps) {
            return '<a href="' . url('admin/hcp/' . $hcps->hcp_id . '/edit') . '" class="btn btn-sm btn-primary me-2">Edit</a>' .
            '<a href="javascript:void(0)" onclick="hcpDelete(' . $hcps->hcp_id . ')" class="btn btn-sm btn-danger">Delete</a>';
          })
          ->make(true); 
      
    } 
       public function devicesdata(){ 
       
          $device = Device::all();
   
        return DataTables::of($device)
          ->addColumn('action', function($device) {
            return '<a href="' . url('admin/devices/' . $device->id . '/view') . '" class="btn btn-sm btn-primary me-2">View</a>';
          })
          ->make(true); 
          
       }
    
    

    public function hcp_delete($id){
         $data = Hcp::findOrFail($id);
         $data->delete();
         return response()->json(['message' => 'Hcp Delete Successfull', 'status' => true]);
    }
    public function hcpadd(){
        return view('admin.hcp.create');
    } 
    
      public function nearLabs(){
      return view('admin.nearlabs.list');
    } 
    
         public function nearLabsAdd(){
      return view('admin.nearlabs.create');
    }   
    
    
   public function labeStore(Request $request)
{ 
    try {
        // Validate input data
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:near_labs,email',
            'phone' => 'required|string|max:15',
            'address' => 'required|string|max:500',
            'latitude' => 'required|numeric|between:-90,90',
            'longitude' => 'required|numeric|between:-180,180',
            'icon_url' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', // Validating image file
        ]);

        // Handle file upload
        if ($request->hasFile('icon_url')) {
            $file = $request->file('icon_url');
            $fileName = time() . '_' . $file->getClientOriginalName(); 
            $file->storeAs('mapicon', $fileName, 'public');
            $validated['icon_url'] = $fileName;  // Assign filename correctly
        }

        // Save data in database
        $nearLab = NearLab::create($validated);

        Log::info('NearLab created successfully!', ['data' => $nearLab]);

        return response()->json([
            'message' => 'Lab created successfully!',
            'data' => $nearLab
        ], 201);

    } catch (\Throwable $e) {
        Log::error('Error while creating NearLab.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Something went wrong while creating the lab.',
            'error' => $e->getMessage()
        ], 500);
    }
}
 


          public function nearLabsData(){
          
       $NearLab = NearLab::all();
   
        return DataTables::of($NearLab)
          ->addColumn('action', function($NearLab) {
            return '<a href="' . url('admin/near-labs-edit/' . $NearLab->id . '/edit') . '" class="btn btn-sm btn-primary me-2">Edit</a>' .
            '<a href="javascript:void(0)" onclick="LabsDelete(' . $NearLab->id . ')" class="btn btn-sm btn-danger">Delete</a>';
          })
          ->make(true); 
    }   
    
    
        
       public function nearLabsDelete($id)
{
    try { 
       
    
            $nearLab = NearLab::findOrFail($id);

            $nearLab->delete();

            Log::info('NearLab deleted successfully!', ['id' => $id]);

            return response()->json([
                'message' => 'NearLab deleted successfully!',
            ]);
        

    } catch (\Exception $e) {
        Log::error('Error while deleting NearLab.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Error while deleting NearLab.',
            'error' => $e->getMessage()
        ], 500);
    }
}
 
   
    
    public function hcpedit($id){
      $hcpdata = Hcp::with(['hcpEducation', 'hcpLicense'])->find($id);
      
 
        return view('admin.hcp.edit', compact('hcpdata'));
    }
    
        
    public function nearLabsEdit(Request $request, $id)
{
    try {
        // Find the lab entry
        $nearlabs = NearLab::findOrFail($id);

        if ($request->ajax()) {
            // Validate the input
            $validated = $request->validate([
                'name' => 'required|string|max:255',
                'email' => 'sometimes|required|email|unique:near_labs,email,' . $id,
                'phone' => 'sometimes|required|string|max:15',
                'address' => 'sometimes|required|string|max:500',
                'latitude' => 'sometimes|required|numeric|between:-90,90',
                'longitude' => 'sometimes|required|numeric|between:-180,180',
                'icon_url' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048', // Image validation
            ]);

            // Handle file upload if a new file is provided
            if ($request->hasFile('icon_url')) {
                $file = $request->file('icon_url');
                $fileName = time() . '_' . $file->getClientOriginalName();
                $file->storeAs('mapicon', $fileName, 'public');
                $validated['icon_url'] = $fileName; // Assign filename correctly
            }

            // Update the database record
            $nearlabs->update($validated);

            Log::info('NearLab updated successfully!', ['data' => $nearlabs]);

            return response()->json([
                'message' => 'NearLab updated successfully!',
                'data' => $nearlabs
            ]);
        }

        return view('admin.nearlabs.edit', compact('nearlabs'));

    } catch (\Exception $e) {
        Log::error('Error while editing NearLab.', [
            'error' => $e->getMessage(),
            'request_data' => $request->all()
        ]);

        return response()->json([
            'message' => 'Something went wrong while editing the lab.',
            'error' => $e->getMessage()
        ], 500);
    }
}
   
    
    
    
    
    public function hcpupdate(Request $request , $id){
        
        $validatedData = $request->validate([
            'title' => 'required|string|max:50',
            'first_name' => 'required|string|max:50',
            'middle_name' => 'nullable|string|max:50',
            'last_name' => 'required|string|max:50',
            'contact_phone_office' => 'nullable|string|max:20',
            'contact_phone_personal' => 'nullable|string|max:20',
            'email' => 'nullable|email|max:100',
            'address' => 'nullable|string',
            'school_graduated' => 'nullable|string|max:100',
            'overall_rating' => 'nullable|numeric|min:0|max:5',

        ]);
        
        
        try {

              $hcp = Hcp::findOrFail($id); 
            
               if ($request->hasFile('image')) {
               
                  $oldImagePath = public_path('hcpImage/' . $hcp->image);

                    if (file_exists($oldImagePath)) {
                        unlink($oldImagePath);
                    }
                    
                  $imageName = time() . '.' . $request->image->extension();
                  $request->image->move(public_path('hcpImage'), $imageName);
                  $validatedData['image'] = $imageName; // Add the image path to validated data
                 }
           
           
     
            $hcp->update($validatedData);
            
            
            
               $hcp = Hcp::findOrFail($id);

                $hcp->hcpLicense()->delete();
                 $hcp->hcpEducation()->delete();

      if ($request->has('degree')) {
             foreach ($request->degree as $key => $degree) {
            $hcp->hcpEducation()->create([
                'degree' => $degree,
                'specialization' => $request->specialization[$key],
                'awarded_year' => $request->awarded_year[$key],
            ]);
        }
    }
    

            if ($request->has('license_number')) {
             foreach ($request->license_number as $key => $licenseNumber) {
            $hcp->hcpLicense()->create([
                'license_number' => $licenseNumber,
                'issuing_authority' => $request->issuing_authority[$key],
                'issue_date' => $request->issue_date[$key],
                'expiry_date' => $request->expiry_date[$key],
              ]);
              }
            }
    
            Log::info('Hcp Update Successful.');
            return redirect()->route('admin.hcp')->with('success', 'Hcp Update Successfully!'); 
        } catch (\Throwable $th) {
            Log::error('Error Hcp Update: ' . $th->getMessage());
            return redirect()->back()->with('error', 'An error occurred while Hcp the Update.');
        }



    }
    

    
    
    public function hcpcreate(Request $request){
       
       
    
        $validatedData = $request->validate([
            'title' => 'required|string|max:50',
            'first_name' => 'required|string|max:50',
            'middle_name' => 'nullable|string|max:50',
            'last_name' => 'required|string|max:50',
            'contact_phone_office' => 'nullable|string|max:20',
            'contact_phone_personal' => 'nullable|string|max:20',
            'email' => 'nullable|email|max:100',
            'address' => 'nullable|string',
            'school_graduated' => 'nullable|string|max:100',
            'overall_rating' => 'nullable|numeric|min:0|max:5',
             'password' => 'required|string|min:8',
        ]);

        try {
        
            if ($request->hasFile('image')) {
            $imageName = time() . '.' . $request->image->extension();
            $request->image->move(public_path('hcpImage'), $imageName);
            $validatedData['image'] = $imageName;
           }
           
            $validatedData['password'] = Hash::make($validatedData['password']);

         
           $hcp = Hcp::create($validatedData); 
           
  
             $degrees = $request->input('degree');
        $specializations = $request->input('specialization');
        $awardedYears = $request->input('awarded_year');
        if ($request->hasFile('document_image')) {
          $ducoment_images = $request->file('document_image');
          }

            foreach ($degrees as $key => $degree) {
            
              $documentImagePath = null;
              
              if (isset($ducoment_images[$key])) {
                $imageName_doc = time() . '_' . $key . '.' . $ducoment_images[$key]->extension();
               $ducoment_images[$key]->move(public_path('hcp_edu_document'), $imageName_doc);
               $documentImagePath =  $imageName_doc;
              }
                HcpEducation::create([
                    'hcp_id' => $hcp->hcp_id, // Use the created Hcp's ID
                    'degree' => $degree,
                    'specialization' => $specializations[$key],
                    'awarded_year' => $awardedYears[$key],
                    'document_image' => $documentImagePath,
                ]);
           }
        
        
        
             $license_number = $request->input('license_number');
             $issuing_authority = $request->input('issuing_authority');
             $issue_date   = $request->input('issue_date');
             $expiry_date   = $request->input('expiry_date');
             
              if ($request->hasFile('lic_document_image')) {
               $lic_ducoment_image = $request->file('lic_document_image');
               }
             
                foreach ($license_number as $key => $license) { 
                
                 $licducomentimage = null;
              
              if (isset($lic_ducoment_image[$key])) {
                $imageName_lic = time() . '_' . $key . '.' . $lic_ducoment_image[$key]->extension();
               $lic_ducoment_image[$key]->move(public_path('hcp_lic_document'), $imageName_lic);
               $licducomentimage = $imageName_lic;
              }
                HcpLicense::create([
                    'hcp_id' => $hcp->hcp_id, // Use the created Hcp's ID
                    'license_number' => $license,
                    'issuing_authority' => $issuing_authority[$key],
                    'issue_date' => $issue_date[$key],
                    'expiry_date' => $expiry_date[$key],
                    'lic_document_image' => $licducomentimage,  
                ]); 
           }
        
             Log::info('Hcp Created Successful.');
            return redirect()->route('admin.hcp')->with('success', 'Hcp Created Successfully!'); 
        } catch (\Throwable $th) {
            Log::error('Error Hcp Created: ' . $th->getMessage());
            return redirect()->back()->with('error', 'An error occurred while Hcp the Created.');
        }
    } 
    
    
    
} 

