Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/admin.ondemand.codeskitter.site/app/Controllers/partner/
Upload File :
Current File : /home/users/unlimited/www/admin.ondemand.codeskitter.site/app/Controllers/partner/Gallery.php

<?php

namespace App\Controllers\partner;

use App\Models\Partners_model;
use Aws\S3\S3Client;
use Exception;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use ZipArchive;

class Gallery extends Partner
{
    public  $validations, $db;
    protected Partners_model $partner; // Declare the $partner property with the correct type

    public function __construct()
    {
        parent::__construct();
        $this->db      = \Config\Database::connect();
    }
    // public function index()
    // {
    //     if (!$this->isLoggedIn) {
    //         return redirect('partner/login');
    //     }
    //     $user_id = $this->ionAuth->user()->row()->id;
    //     setPageInfo($this->data, 'Gallery | Provider Panel', 'gallery');
    //     $directoryPaths = [
    //         FCPATH . '/public/uploads',
    //         FCPATH . '/public/backend/assets'
    //     ];
    //     $not_allowed_folders = [
    //         'mpdf', 'tools', 'css', 'fonts', 'js', 'categories', 'chat_attachement', 'languages', 'ratings', 'media', 'notification',
    //         'offers', 'provider_bulk_upload', 'site', 'sliders', 'users',
    //         'img', 'images', 'web_settings', 'chat_attachment', 'promocodes', 'provider_bulk_file', 'service_bulk_upload'
    //     ];
    //     $partner = fetch_details('partner_details', ['partner_id' => $user_id], ['banner', 'national_id', 'passport', 'address_id']);
    //     $services = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
    //     $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
    //     // Get partner files
    //     $partnerFiles = [];
    //     $fields = [
    //         'partner_details' => ['banner', 'national_id', 'passport', 'address_id'],
    //         'services' => ['image', 'other_images', 'files'],
    //         'orders' => ['work_started_proof', 'work_completed_proof']
    //     ];
    //     foreach ($fields as $type => $typeFields) {
    //         $data = $type === 'partner_details' ? [$partner[0]] : ($$type ?? []);
    //         foreach ($data as $item) {
    //             foreach ($typeFields as $field) {
    //                 if (!empty($item[$field])) {
    //                     $files = json_decode($item[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $item[$field]);
    //                     }
    //                     $partnerFiles = array_merge($partnerFiles, $files);
    //                 }
    //             }
    //         }
    //     }
    //     $partnerFiles = array_unique(array_filter($partnerFiles, 'strlen'));
    //     // Get folder data
    //     $folderData = [];
    //     foreach ($directoryPaths as $directoryPath) {
    //         $folders = array_filter(glob($directoryPath . '/*'), 'is_dir');
    //         foreach ($folders as $folder) {
    //             $publicPos = strpos($folder, '/public/');
    //             $pathIncludingPublic = $publicPos !== false ? substr($folder, $publicPos) : $folder;
    //             $folderName = basename($folder);
    //             if (!in_array($folderName, $not_allowed_folders)) {
    //                 $files = glob($folder . '/*');
    //                 $normalizedPartnerFiles = array_map(function ($file) {
    //                     return ltrim(str_replace(FCPATH, '', $file), '/');
    //                 }, $partnerFiles);
    //                 $partnerFolderFiles = array_filter($files, function ($file) use ($normalizedPartnerFiles) {
    //                     $normalizedFile = ltrim(str_replace(FCPATH, '', $file), '/');
    //                     return in_array($normalizedFile, $normalizedPartnerFiles) && file_exists($file) && !preg_match('/\.(txt|html)$/i', $file);
    //                 });
    //                 $fileCount = count($partnerFolderFiles);
    //                 if ($fileCount > 0) {
    //                     $folderData[] = [
    //                         'name' => $folderName,
    //                         'path' => $pathIncludingPublic,
    //                         'file_count' => $fileCount
    //                     ];
    //                 }
    //             }
    //         }
    //     }
    //     $this->data['folders'] = $folderData;
    //     $this->data['users'] = fetch_details('users', ['id' => $user_id], ['company']);
    //     return view('backend/partner/template', $this->data);
    // }
    // public function index()
    // {
    //     if (!$this->isLoggedIn) {
    //         return redirect('partner/login');
    //     }

    //     $user_id = $this->ionAuth->user()->row()->id;
    //     setPageInfo($this->data, 'Gallery | Provider Panel', 'gallery');
    //     $settings = get_settings('general_settings', true);
    //     $file_manager = $settings['file_manager'];
    //     if ($file_manager == "aws_s3") {
    //         $not_allowed_folders = [
    //             'mpdf',
    //             'tools',
    //             'css',
    //             'fonts',
    //             'js',
    //             'categories',
    //             'chat_attachement',
    //             'languages',
    //             'ratings',
    //             'media',
    //             'notification',
    //             'offers',
    //             'provider_bulk_upload',
    //             'site',
    //             'sliders',
    //             'users',
    //             'img',
    //             'images'
    //         ];

    //         // Get all partner files from database
    //         $partner = fetch_details(
    //             'partner_details',
    //             ['partner_id' => $user_id],
    //             ['banner', 'national_id', 'passport', 'address_id']
    //         );
    //         $services = fetch_details(
    //             'services',
    //             ['user_id' => $user_id],
    //             ['image', 'other_images', 'files']
    //         );
    //         $orders = fetch_details(
    //             'orders',
    //             ['partner_id' => $user_id],
    //             ['work_started_proof', 'work_completed_proof']
    //         );

    //         // Collect all files in one array
    //         $partnerFiles = [];

    //         // Add partner files
    //         foreach (['banner', 'national_id', 'passport', 'address_id'] as $field) {
    //             if (!empty($partner[0][$field])) {
    //                 $files = json_decode($partner[0][$field], true);
    //                 if (json_last_error() !== JSON_ERROR_NONE) {
    //                     $files = explode(',', $partner[0][$field]);
    //                 }
    //                 if (is_array($files)) {
    //                     foreach ($files as $file) {
    //                         $partnerFiles[] = $field . '/' . $file; // Use the field name as the folder prefix
    //                     }
    //                 }
    //             }
    //         }

    //         // Add service files
    //         foreach ($services as $service) {
    //             foreach (['image', 'other_images', 'files'] as $field) {
    //                 if (!empty($service[$field])) {
    //                     $files = json_decode($service[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $service[$field]);
    //                     }
    //                     if (is_array($files)) {
    //                         foreach ($files as $file) {
    //                             $partnerFiles[] = 'service/' . $file; // Prefix with 'service'
    //                         }
    //                     }
    //                 }
    //             }
    //         }

    //         // Add order files
    //         foreach ($orders as $order) {
    //             foreach (['work_started_proof', 'work_completed_proof'] as $field) {
    //                 if (!empty($order[$field])) {
    //                     $files = json_decode($order[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $order[$field]);
    //                     }
    //                     if (is_array($files)) {
    //                         foreach ($files as $file) {
    //                             $partnerFiles[] = 'order/' . $file; // Prefix with 'order'
    //                         }
    //                     }
    //                 }
    //             }
    //         }


    //         // Remove duplicates and empty entries
    //         $partnerFiles = array_unique(array_filter($partnerFiles));

    //         // Get file details from S3
    //         $fileDetails = [];
    //         foreach ($partnerFiles as $filePath) {
    //             // Skip files in not allowed folders
    //             $folder = explode('/', $filePath)[0];
    //             if (in_array($folder, $not_allowed_folders)) {
    //                 continue;
    //             }

    //             // Get file details from S3
    //             $result = get_aws_s3_file($filePath);

    //             echo "<pre>";
    //             print_R($result['data']);
    //             die;
    //             if (!$result['error']) {
    //                 // $fileDetails[] = $result['data'];
    //             }
    //         }
    //         die;

    //         // Sort files by last modified date (newest first)
    //         usort($fileDetails, function ($a, $b) {
    //             return strtotime($b['lastModified']) - strtotime($a['lastModified']);
    //         });
    //     } else if ($file_manager == "local_server") {
    //         // Define paths and excluded folders
    //         $directoryPaths = [
    //             FCPATH . '/public/uploads',
    //             FCPATH . '/public/backend/assets'
    //         ];

    //         $not_allowed_folders = [
    //             'mpdf',
    //             'tools',
    //             'css',
    //             'fonts',
    //             'js',
    //             'categories',
    //             'chat_attachement',
    //             'languages',
    //             'ratings',
    //             'media',
    //             'notification',
    //             'offers',
    //             'provider_bulk_upload',
    //             'site',
    //             'sliders',
    //             'users',
    //             'img',
    //             'images'
    //         ];

    //         // Get all partner files
    //         $partner = fetch_details(
    //             'partner_details',
    //             ['partner_id' => $user_id],
    //             ['banner', 'national_id', 'passport', 'address_id']
    //         );
    //         $services = fetch_details(
    //             'services',
    //             ['user_id' => $user_id],
    //             ['image', 'other_images', 'files']
    //         );
    //         $orders = fetch_details(
    //             'orders',
    //             ['partner_id' => $user_id],
    //             ['work_started_proof', 'work_completed_proof']
    //         );

    //         // Collect all files in one array
    //         $partnerFiles = [];

    //         // Add partner files
    //         foreach (['banner', 'national_id', 'passport', 'address_id'] as $field) {
    //             if (!empty($partner[0][$field])) {
    //                 $files = json_decode($partner[0][$field], true);
    //                 if (json_last_error() !== JSON_ERROR_NONE) {
    //                     $files = explode(',', $partner[0][$field]);
    //                 }
    //                 if (is_array($files)) {
    //                     $partnerFiles = array_merge($partnerFiles, $files);
    //                 }
    //             }
    //         }

    //         // Add service files
    //         foreach ($services as $service) {
    //             foreach (['image', 'other_images', 'files'] as $field) {
    //                 if (!empty($service[$field])) {
    //                     $files = json_decode($service[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $service[$field]);
    //                     }
    //                     if (is_array($files)) {
    //                         $partnerFiles = array_merge($partnerFiles, $files);
    //                     }
    //                 }
    //             }
    //         }

    //         // Add order files
    //         foreach ($orders as $order) {
    //             foreach (['work_started_proof', 'work_completed_proof'] as $field) {
    //                 if (!empty($order[$field])) {
    //                     $files = json_decode($order[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $order[$field]);
    //                     }
    //                     if (is_array($files)) {
    //                         $partnerFiles = array_merge($partnerFiles, $files);
    //                     }
    //                 }
    //             }
    //         }

    //         // Remove duplicates and empty entries
    //         $partnerFiles = array_unique(array_filter($partnerFiles));

    //         // Get folder data
    //         $folderData = [];
    //         foreach ($directoryPaths as $directoryPath) {
    //             $folders = array_filter(glob($directoryPath . '/*'), 'is_dir');

    //             foreach ($folders as $folder) {
    //                 $folderName = basename($folder);

    //                 // Skip excluded folders
    //                 if (in_array($folderName, $not_allowed_folders)) {
    //                     continue;
    //                 }

    //                 // Get relative path
    //                 $relativePath = str_replace(FCPATH, '', $folder);

    //                 // Count files in this folder that belong to partner
    //                 $fileCount = 0;
    //                 $files = glob($folder . '/*');

    //                 foreach ($files as $file) {
    //                     $relativeFilePath = ltrim(str_replace(FCPATH, '', $file), '/');
    //                     if (
    //                         in_array($relativeFilePath, $partnerFiles) &&
    //                         file_exists($file) &&
    //                         !preg_match('/\.(txt|html)$/i', $file)
    //                     ) {
    //                         $fileCount++;
    //                     }
    //                 }

    //                 // Add folder if it contains partner files
    //                 if ($fileCount > 0) {
    //                     $folderData[] = [
    //                         'name' => $folderName,
    //                         'path' => $relativePath,
    //                         'file_count' => $fileCount
    //                     ];
    //                 }
    //             }
    //         }
    //     }


    //     // Set view data
    //     $this->data['folders'] = $folderData;
    //     $this->data['users'] = fetch_details('users', ['id' => $user_id], ['company']);

    //     return view('backend/partner/template', $this->data);
    // }
    public function index()
    {
        if (!$this->isLoggedIn) {
            return redirect('partner/login');
        }

        $user_id = $this->ionAuth->user()->row()->id;
        setPageInfo($this->data, 'Gallery | Provider Panel', 'gallery');

        $settings = get_settings('general_settings', true);
        $file_manager = $settings['file_manager'];

        $not_allowed_folders = [
            'mpdf',
            'tools',
            'css',
            'fonts',
            'js',
            'categories',
            'chat_attachement',
            'languages',
            'ratings',
            'media',
            'notification',
            'offers',
            'provider_bulk_upload',
            'site',
            'sliders',
            'users',
            'img',
            'images'
        ];

        $partnerFiles = [];
        $foldersToCheck = [];
        $folderData = [];

        // Fetch files from database
        $partner = fetch_details('partner_details', ['partner_id' => $user_id], ['banner', 'national_id', 'passport', 'address_id']);
        $services = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
        $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);

        // Helper function to decode or split files
        $parseFiles = function ($data) {
            $files = json_decode($data, true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                $files = explode(',', $data);
            }
            return is_array($files) ? array_filter($files) : [];
        };

        // Collect partner files
        foreach (['banner', 'national_id', 'passport', 'address_id'] as $field) {
            if (!empty($partner[0][$field])) {
                $files = $parseFiles($partner[0][$field]);
                foreach ($files as $file) {
                    $partnerFiles[] = $field . '/' . $file; // Prefix with folder
                }
            }
        }

        // Collect service files
        foreach ($services as $service) {
            foreach (['image', 'other_images', 'files'] as $field) {
                if (!empty($service[$field])) {
                    $files = $parseFiles($service[$field]);
                    foreach ($files as $file) {
                        $partnerFiles[] = $field . '/' . $file; // Prefix with service folder
                    }
                }
            }
        }

        // Collect order files
        foreach ($orders as $order) {
            foreach (['work_started_proof', 'work_completed_proof'] as $field) {
                if (!empty($order[$field])) {
                    $files = $parseFiles($order[$field]);
                    foreach ($files as $file) {
                        $partnerFiles[] = $field . '/' . $file; // Prefix with order folder
                    }
                }
            }
        }

        // Remove duplicates and empty entries
        $partnerFiles = array_unique(array_filter($partnerFiles));

        // Determine file manager (AWS or Local)
        if ($file_manager == "aws_s3") {
            // Fetch details from AWS S3
            foreach ($partnerFiles as $filePath) {
                $folder = explode('/', $filePath)[0];
                if (in_array($folder, $not_allowed_folders)) {
                    continue;
                }

                // Check if folder data already exists to avoid redundant API calls
                if (!in_array($folder, $foldersToCheck)) {
                    $foldersToCheck[] = $folder;
                    $result = get_aws_s3_folder_info($folder);

                    if (isset($result['data']) && !$result['error']) {
                        foreach ($result['data'] as $value) {
                            $folderData[] = [
                                'name' => $value['name'],
                                'file_count' => $value['fileCount'],
                                'path' => $value['path']
                            ];
                        }
                    }
                }
            }
        } elseif ($file_manager == "local_server") {
            // Local file system directories
            $directoryPaths = [
                FCPATH . '/public/uploads',
                FCPATH . '/public/backend/assets'
            ];

            foreach ($directoryPaths as $directoryPath) {
                // Get directories in the specified path
                $folders = array_filter(glob($directoryPath . '/*'), 'is_dir');

                foreach ($folders as $folder) {
                    $folderName = basename($folder);
                    if (in_array($folderName, $not_allowed_folders)) {
                        continue;
                    }

                    $relativePath = str_replace(FCPATH, '', $folder);
                    $fileCount = 0;

                    // Count files matching criteria
                    foreach (glob($folder . '/*') as $file) {
                        $relativeFilePath = ltrim(str_replace(FCPATH, '', $file), '/');
                        if (
                            in_array($relativeFilePath, $partnerFiles) &&
                            file_exists($file) &&
                            !preg_match('/\.(txt|html)$/i', $file) // Exclude unwanted file types
                        ) {
                            $fileCount++;
                        }
                    }

                    // Add to folder data if files found
                    if ($fileCount > 0) {
                        $folderData[] = [
                            'name' => $folderName,
                            'path' => $relativePath,
                            'file_count' => $fileCount
                        ];
                    }
                }
            }
        }

        // Set view data
        $this->data['folders'] = $folderData;
        $this->data['users'] = fetch_details('users', ['id' => $user_id], ['company']);

        return view('backend/partner/template', $this->data);
    }


    // public function GetGallaryFiles()
    // {
    //     // Ensure the user is logged in
    //     if (!$this->isLoggedIn) {
    //         return redirect('partner/login');
    //     }
    //     $user_id = $this->ionAuth->user()->row()->id;
    //     $uri = service('uri');
    //     $segments = $uri->getSegments();
    //     $settings = get_settings('general_settings', true);
    //     $file_manager = $settings['file_manager'];
    //     $not_allowed_folders = [
    //         'mpdf', 'tools', 'css', 'fonts', 'js', 'categories', 'chat_attachement', 
    //         'languages', 'ratings', 'media', 'notification', 'offers', 'provider_bulk_upload', 
    //         'site', 'sliders', 'users', 'img', 'images'
    //     ];
    //     if($file_manager=="aws_s3"){



    //         $details = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
    //         $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
    //         $details = array_merge($details, $orders);

    //         $getFileNames = function ($field) use ($details) {
    //             return array_reduce($details, function ($carry, $item) use ($field) {
    //                 if (!empty($item[$field])) {
    //                     $files = json_decode($item[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $item[$field]);
    //                     }
    //                     $carry = array_merge($carry, array_map('basename', $files));
    //                 }
    //                 return $carry;
    //             }, []);
    //         };

    //         $allFiles = array_unique(array_filter(array_merge(
    //             $getFileNames('image'),
    //             $getFileNames('other_images'),
    //             $getFileNames('files'),
    //             $getFileNames('national_id'),
    //             $getFileNames('address_id'),
    //             $getFileNames('banner'),
    //             $getFileNames('passport'),
    //             $getFileNames('work_started_proof'),
    //             $getFileNames('work_completed_proof'),
    //         ), 'strlen'));

    //         $filesData = array_filter($files, function ($file) use ($allFiles) {
    //             return in_array($file['name'], $allFiles) && $file['type'] != "text/html";
    //         });

    //     }else if($file_manager=="local_server"){
    //         $new_path = implode('/', array_slice($segments, array_search('get-gallery-files', $segments) + 1));
    //         $folderPath = rtrim(FCPATH, '/') . '/' . $new_path;

    //         $files = glob($folderPath . '/*');

    //         $details = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
    //         $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
    //         $details = array_merge($details, $orders);
    //         $getFileNames = function ($field) use ($details) {
    //             return array_reduce($details, function ($carry, $item) use ($field) {
    //                 if (!empty($item[$field])) {
    //                     $files = json_decode($item[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $item[$field]);
    //                     }
    //                     $carry = array_merge($carry, array_map('basename', $files));
    //                 }
    //                 return $carry;
    //             }, []);
    //         };
    //         $allFiles = array_unique(array_filter(array_merge(
    //             $getFileNames('image'),
    //             $getFileNames('other_images'),
    //             $getFileNames('files'),
    //             $getFileNames('national_id'),
    //             $getFileNames('address_id'),
    //             $getFileNames('banner'),
    //             $getFileNames('passport'),
    //             $getFileNames('work_started_proof'),
    //             $getFileNames('work_completed_proof'),
    //         ), 'strlen'));
    //         $filesData = array_map(function ($file) use ($new_path, $allFiles) {
    //             $fileInfo = pathinfo($file);
    //             $fileName = $fileInfo['basename'];
    //             if (in_array($fileName, $allFiles) && mime_content_type($file) != "text/html") {
    //                 return [
    //                     'name' => $fileName,
    //                     'type' => mime_content_type($file),
    //                     'size' => $this->formatFileSize(filesize($file)),
    //                     'full_path' => base_url() . '/' . $new_path . '/' . $fileName,
    //                     'path' => $new_path . '/' . $fileName,
    //                 ];
    //             }
    //         }, $files);
    //     }



    //     $this->data['files'] = array_filter($filesData);
    //     $this->data['folder_name'] = end($segments);
    //     $this->data['total_files'] = count($this->data['files']);
    //     $this->data['path'] = $new_path;
    //     setPageInfo($this->data, 'Gallery-' . $this->data['folder_name'] . ' | Provider Panel', 'gallery_files');
    //     return view('backend/partner/template', $this->data);
    // }
    //     public function GetGallaryFiles()
    // {
    //     // Ensure the user is logged in
    //     if (!$this->isLoggedIn) {
    //         return redirect('partner/login');
    //     }
    //     $user_id = $this->ionAuth->user()->row()->id;
    //     $uri = service('uri');
    //     $segments = $uri->getSegments();
    //     $settings = get_settings('general_settings', true);
    //     $file_manager = $settings['file_manager'];
    //     $not_allowed_folders = [
    //         'mpdf', 'tools', 'css', 'fonts', 'js', 'categories', 'chat_attachement', 
    //         'languages', 'ratings', 'media', 'notification', 'offers', 'provider_bulk_upload', 
    //         'site', 'sliders', 'users', 'img', 'images'
    //     ];

    //     if ($file_manager == "aws_s3") {
    //         if ($file_manager == "aws_s3") {
    //             $files = get_provider_files_from_aws_s3_folder($segments);

    //             $details = [];

    //             $partner = fetch_details('partner_details', ['partner_id' => $user_id], ['passport', 'national_id', 'banner', 'address_id']);
    //             $details = array_merge($details, $partner);

    //             $services = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
    //             $details = array_merge($details, $services);

    //             $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
    //             $details = array_merge($details, $orders);

    //             $new_path = implode('/', array_slice($segments, array_search('get-gallery-files', $segments) + 1));

    //             $carry = [];
    //             foreach ($details as $item) {
    //                 foreach (['passport', 'national_id', 'banner', 'address_id', 'image', 'other_images', 'files', 'work_started_proof', 'work_completed_proof'] as $field) {
    //                     if (!empty($item[$field])) {
    //                         $filesList = json_decode($item[$field], true);
    //                         if (json_last_error() !== JSON_ERROR_NONE) {
    //                             $filesList = explode(',', $item[$field]);
    //                         }
    //                         foreach ($filesList as $file) {
    //                             // $fileName = basename($file);

    //                             // print_R($fileName);
    //                             print_R($file);

    //                             die;
    //                             foreach ($files as $awsFile) {
    //                                 if ($fileName === $awsFile['name']) {
    //                                     $carry[] = [
    //                                         'name' => $fileName,
    //                                         'type' => $awsFile['type'],
    //                                         'size' => $awsFile['size'],
    //                                         'full_path' => $awsFile['full_path'],
    //                                         'path' => $awsFile['path'],
    //                                     ];
    //                                 }
    //                             }
    //                         }
    //                     }
    //                 }
    //             }


    //             // $allFiles = array_unique(array_filter(array_merge($carry), 'strlen'));

    //             $filesData = [];
    //             foreach ($carry as $file) {
    //                 if (in_array($file['name'], $carry) && $file['type'] != "text/html") {
    //                     $filesData[] = $file;
    //                 }
    //             }

    //         } 


    //     } else if ($file_manager == "local_server") {
    //         $new_path = implode('/', array_slice($segments, array_search('get-gallery-files', $segments) + 1));
    //         $folderPath = rtrim(FCPATH, '/') . '/' . $new_path;

    //         $files = glob($folderPath . '/*');

    //         $details = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
    //         $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
    //         $details = array_merge($details, $orders);
    //         $getFileNames = function ($field) use ($details) {
    //             return array_reduce($details, function ($carry, $item) use ($field) {
    //                 if (!empty($item[$field])) {
    //                     $files = json_decode($item[$field], true);
    //                     if (json_last_error() !== JSON_ERROR_NONE) {
    //                         $files = explode(',', $item[$field]);
    //                     }
    //                     $carry = array_merge($carry, array_map('basename', $files));
    //                 }
    //                 return $carry;
    //             }, []);
    //         };
    //         $allFiles = array_unique(array_filter(array_merge(
    //             $getFileNames('image'),
    //             $getFileNames('other_images'),
    //             $getFileNames('files'),
    //             $getFileNames('national_id'),
    //             $getFileNames('address_id'),
    //             $getFileNames('banner'),
    //             $getFileNames('passport'),
    //             $getFileNames('work_started_proof'),
    //             $getFileNames('work_completed_proof'),
    //         ), 'strlen'));
    //         $filesData = array_map(function ($file) use ($new_path, $allFiles) {
    //             $fileInfo = pathinfo($file);
    //             $fileName = $fileInfo['basename'];
    //             if (in_array($fileName, $allFiles) && mime_content_type($file) != "text/html") {
    //                 return [
    //                     'name' => $fileName,
    //                     'type' => mime_content_type($file),
    //                     'size' => $this->formatFileSize(filesize($file)),
    //                     'full_path' => base_url() . '/' . $new_path . '/' . $fileName,
    //                     'path' => $new_path . '/' . $fileName,
    //                 ];
    //             }
    //         }, $files);
    //     }

    //     $this->data['files'] = array_filter($filesData);
    //     $this->data['folder_name'] = end($segments);
    //     $this->data['total_files'] = count($this->data['files']);
    //     $this->data['path'] = $new_path;
    //     setPageInfo($this->data, 'Gallery-' . $this->data['folder_name'] . ' | Provider Panel', 'gallery_files');
    //     return view('backend/partner/template', $this->data);
    // }
    public function GetGallaryFiles()
    {
        // Ensure the user is logged in
        if (!$this->isLoggedIn) {
            return redirect('partner/login');
        }
        $user_id = $this->ionAuth->user()->row()->id;
        $uri = service('uri');
        $segments = $uri->getSegments();
        $settings = get_settings('general_settings', true);
        $file_manager = $settings['file_manager'];
        $not_allowed_folders = [
            'mpdf',
            'tools',
            'css',
            'fonts',
            'js',
            'categories',
            'chat_attachement',
            'languages',
            'ratings',
            'media',
            'notification',
            'offers',
            'provider_bulk_upload',
            'site',
            'sliders',
            'users',
            'img',
            'images'
        ];
        if ($file_manager == "aws_s3") {
            $files = get_provider_files_from_aws_s3_folder($segments);

            $details = [];

            $partner = fetch_details('partner_details', ['partner_id' => $user_id], ['passport', 'national_id', 'banner', 'address_id']);
            $details = array_merge($details, $partner);

            $services = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
            $details = array_merge($details, $services);

            $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
            $details = array_merge($details, $orders);

            $new_path = implode('/', array_slice($segments, array_search('get-gallery-files', $segments) + 1));

            $carry = [];
            foreach ($details as $item) {
                foreach (['passport', 'national_id', 'banner', 'address_id', 'image', 'other_images', 'files', 'work_started_proof', 'work_completed_proof'] as $field) {
                    if (!empty($item[$field])) {
                        $filesList = json_decode($item[$field], true);
                        if (json_last_error() !== JSON_ERROR_NONE) {
                            $filesList = explode(',', $item[$field]);
                        }
                        foreach ($filesList as $file) {
                            $fileName = basename($file);
                            foreach ($files as $awsFile) {

                                if ($fileName === $awsFile['name']) {
                                    $carry[] = $fileName;
                                }
                            }
                        }
                    }
                }
            }

            $allFiles = array_unique(array_filter($carry));

            $filesData = [];
            foreach ($files as $file) {
                if (in_array($file['name'], $allFiles) && $file['type'] != "text/html") {
                    $filesData[] = $file;
                }
            }
        } else if ($file_manager == "local_server") {
            $new_path = implode('/', array_slice($segments, array_search('get-gallery-files', $segments) + 1));
            $folderPath = rtrim(FCPATH, '/') . '/' . $new_path;

            $files = glob($folderPath . '/*');

            $details = [];

            $partner = fetch_details('partner_details', ['partner_id' => $user_id], ['passport', 'national_id', 'banner', 'address_id']);
            $details = array_merge($details, $partner);

            $services = fetch_details('services', ['user_id' => $user_id], ['image', 'other_images', 'files']);
            $details = array_merge($details, $services);

            $orders = fetch_details('orders', ['partner_id' => $user_id], ['work_started_proof', 'work_completed_proof']);
            $details = array_merge($details, $orders);

            $carry = [];
            foreach ($details as $item) {
                foreach (['passport', 'national_id', 'banner', 'address_id', 'image', 'other_images', 'files', 'work_started_proof', 'work_completed_proof'] as $field) {
                    if (!empty($item[$field])) {
                        $filesList = json_decode($item[$field], true);
                        if (json_last_error() !== JSON_ERROR_NONE) {
                            $filesList = explode(',', $item[$field]);
                        }
                        foreach ($filesList as $file) {
                            $filePath = rtrim(FCPATH, '/') . '/' . $new_path . '/' . basename($file);
                            if (file_exists($filePath)) {
                                $carry[] = basename($file);
                            }
                        }
                    }
                }
            }

            $allFiles = array_unique(array_filter($carry));

            $filesData = [];
            foreach ($files as $file) {
                if (in_array(basename($file), $allFiles) && mime_content_type($file) != "text/html") {
                    $filesData[] = [
                        'name' => basename($file),
                        'type' => mime_content_type($file),
                        'size' => $this->formatFileSize(filesize($file)),
                        'full_path' => base_url() . '/' . $new_path . '/' . basename($file),
                        'path' => $new_path . '/' . basename($file),
                    ];
                }
            }
        }

        $this->data['files'] = array_filter($filesData);
        $this->data['folder_name'] = end($segments);
        $this->data['total_files'] = count($this->data['files']);
        $this->data['path'] = $new_path;
        $this->data['disk'] = $file_manager;

        setPageInfo($this->data, 'Gallery-' . $this->data['folder_name'] . ' | Provider Panel', 'gallery_files');
        return view('backend/partner/template', $this->data);
    }

    private function formatFileSize($bytes)
    {
        $units = ['B', 'KB', 'MB', 'GB', 'TB'];
        $bytes = max($bytes, 0);
        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
        $pow = min($pow, count($units) - 1);
        $bytes /= (1 << (10 * $pow));
        return round($bytes, 2) . ' ' . $units[$pow];
    }
    // public function downloadAll()
    // {
    //     if (!$this->isLoggedIn) {
    //         return $this->response->setStatusCode(403)->setJSON(['error' => 'Unauthorized']);
    //     }
    //     $folder = $this->request->getPost('folder');
    //     $full_path = $this->request->getPost('full_path');
    //     $folderPath = FCPATH . $full_path;
    //     if (!is_dir($folderPath) || strpos(realpath($folderPath), FCPATH) !== 0) {
    //         return $this->response->setStatusCode(400)->setJSON(['error' => 'Invalid folder']);
    //     }
    //     $zipName = $folder . '.zip';
    //     $zipPath = FCPATH . 'public/uploads/' . $zipName;
    //     $zip = new ZipArchive();
    //     if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
    //         $files = new RecursiveIteratorIterator(
    //             new RecursiveDirectoryIterator($folderPath),
    //             RecursiveIteratorIterator::LEAVES_ONLY
    //         );
    //         foreach ($files as $name => $file) {
    //             if (!$file->isDir()) {
    //                 $filePath = $file->getRealPath();
    //                 $relativePath = substr($filePath, strlen($folderPath) + 1);
    //                 $zip->addFile($filePath, $relativePath);
    //             }
    //         }
    //         $zip->close();
    //         header('Content-Type: application/zip');
    //         header('Content-Disposition: attachment; filename="' . $zipName . '"');
    //         header('Content-Length: ' . filesize($zipPath));
    //         header('Pragma: no-cache');
    //         header('Expires: 0');
    //         readfile($zipPath);
    //         unlink($zipPath);
    //         exit;
    //     } else {
    //         return $this->response->setStatusCode(500)->setJSON(['error' => 'Could not create zip file']);
    //     }
    // }
    public function downloadAll()
    {

        if (!$this->isLoggedIn ) {
            return $this->response->setStatusCode(403)->setJSON(['error' => 'Unauthorized']);
        }

        $folder = $this->request->getPost('folder');
        $full_path = $this->request->getPost('full_path');
        $file_manager = $this->request->getPost('disk');

        if ($file_manager == "aws_s3") {
            try {
                $S3_settings = get_settings('general_settings', true);
                $aws_key = $S3_settings['aws_access_key_id'] ?? '';
                $aws_secret = $S3_settings['aws_secret_access_key'] ?? '';
                $region = $S3_settings['aws_region'] ?? 'us-east-1';
                $bucket_name = $S3_settings['aws_bucket'] ?? '';

                if (!$aws_key || !$aws_secret || !$bucket_name || !$region) {
                    return $this->response->setStatusCode(400)->setJSON([
                        'error' => 'AWS configuration missing'
                    ]);
                }

                $s3 = new S3Client([
                    'version' => 'latest',
                    'region'  => $region,
                    'credentials' => [
                        'key'    => $aws_key,
                        'secret' => $aws_secret,
                    ]
                ]);

                // Ensure folder path ends with '/'
                $folder_path = rtrim($full_path, '/') . '/';

                // List all objects in the folder
                $objects = $s3->getPaginator('ListObjectsV2', [
                    'Bucket' => $bucket_name,
                    'Prefix' => $folder_path
                ]);

                // Create temporary directory for zip files
                $temp_dir = FCPATH . 'public/uploads/temp/' . uniqid('s3_');
                if (!is_dir($temp_dir)) {
                    mkdir($temp_dir, 0777, true);
                }

                // Download each file from S3
                foreach ($objects as $result) {
                    foreach ($result['Contents'] as $object) {
                        // Skip if it's the folder itself
                        if ($object['Key'] === $folder_path) {
                            continue;
                        }

                        // Create local directory structure
                        $relative_path = substr($object['Key'], strlen($folder_path));
                        $local_path = $temp_dir . '/' . $relative_path;
                        $local_dir = dirname($local_path);

                        if (!is_dir($local_dir)) {
                            mkdir($local_dir, 0777, true);
                        }

                        // Download file from S3
                        $s3->getObject([
                            'Bucket' => $bucket_name,
                            'Key'    => $object['Key'],
                            'SaveAs' => $local_path
                        ]);
                    }
                }

                // Create ZIP file
                $zipName = $folder . '.zip';
                $zipPath = FCPATH . 'public/uploads/' . $zipName;

                $zip = new ZipArchive();
                if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
                    $files = new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator($temp_dir),
                        RecursiveIteratorIterator::LEAVES_ONLY
                    );

                    foreach ($files as $name => $file) {
                        if (!$file->isDir()) {
                            $filePath = $file->getRealPath();
                            $relativePath = substr($filePath, strlen($temp_dir) + 1);
                            $zip->addFile($filePath, $relativePath);
                        }
                    }

                    $zip->close();

                    // Clean up temporary directory
                    $this->deleteDirectory($temp_dir);

                    // Send the ZIP file
                    header('Content-Type: application/zip');
                    header('Content-Disposition: attachment; filename="' . $zipName . '"');
                    header('Content-Length: ' . filesize($zipPath));
                    header('Pragma: no-cache');
                    header('Expires: 0');
                    readfile($zipPath);
                    unlink($zipPath);
                    exit;
                } else {
                    $this->deleteDirectory($temp_dir);
                    return $this->response->setStatusCode(500)->setJSON(['error' => 'Could not create zip file']);
                }
            } catch (Exception $e) {
                return $this->response->setStatusCode(500)->setJSON([
                    'error' => 'AWS Error: ' . $e->getMessage()
                ]);
            }
        } else if ($file_manager == 'local_server') {
            $folderPath = FCPATH . $full_path;

            if (!is_dir($folderPath) || strpos(realpath($folderPath), FCPATH) !== 0) {
                return $this->response->setStatusCode(400)->setJSON(['error' => 'Invalid folder']);
            }

            $zipName = $folder . '.zip';
            $zipPath = FCPATH . 'public/uploads/' . $zipName;
            $zip = new ZipArchive();

            if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
                $files = new RecursiveIteratorIterator(
                    new RecursiveDirectoryIterator($folderPath),
                    RecursiveIteratorIterator::LEAVES_ONLY
                );

                foreach ($files as $name => $file) {
                    if (!$file->isDir()) {
                        $filePath = $file->getRealPath();
                        $relativePath = substr($filePath, strlen($folderPath) + 1);
                        $zip->addFile($filePath, $relativePath);
                    }
                }

                $zip->close();
                header('Content-Type: application/zip');
                header('Content-Disposition: attachment; filename="' . $zipName . '"');
                header('Content-Length: ' . filesize($zipPath));
                header('Pragma: no-cache');
                header('Expires: 0');
                readfile($zipPath);
                unlink($zipPath);
                exit;
            } else {
                return $this->response->setStatusCode(500)->setJSON(['error' => 'Could not create zip file']);
            }
        } else {
            return $this->response->setStatusCode(500)->setJSON(['error' => 'Invalid file manager type']);
        }
    }
}