<?php
/**
 * WordPress Plugin - Plugin Management Methods
 * إدارة البلاجنز - الطرق والوظائف الأساسية
 */

class CSM_Plugin_Manager {
    
    /**
     * جلب قائمة البلاجنز المثبتة
     */
    public function get_installed_plugins($args = array()) {
        if (!function_exists('get_plugins')) {
            require_once ABSPATH . 'wp-admin/includes/plugin.php';
        }
        
        $all_plugins = get_plugins();
        $active_plugins = get_option('active_plugins', array());
        $network_active = is_multisite() ? get_site_option('active_sitewide_plugins', array()) : array();
        
        $plugins_data = array();
        
        foreach ($all_plugins as $plugin_file => $plugin_data) {
            $plugin_info = array(
                'file' => $plugin_file,
                'name' => $plugin_data['Name'],
                'description' => $plugin_data['Description'],
                'version' => $plugin_data['Version'],
                'author' => $plugin_data['Author'],
                'author_uri' => $plugin_data['AuthorURI'],
                'plugin_uri' => $plugin_data['PluginURI'],
                'network' => $plugin_data['Network'],
                'requires_wp' => $plugin_data['RequiresWP'],
                'requires_php' => $plugin_data['RequiresPHP'],
                'update_uri' => $plugin_data['UpdateURI'],
                'text_domain' => $plugin_data['TextDomain'],
                'domain_path' => $plugin_data['DomainPath'],
                'is_active' => in_array($plugin_file, $active_plugins),
                'is_network_active' => array_key_exists($plugin_file, $network_active),
                'auto_update' => $this->is_plugin_auto_update_enabled($plugin_file)
            );
            
            // إضافة معلومات التحديث إن وجدت
            $update_info = $this->get_plugin_update_info($plugin_file);
            if ($update_info) {
                $plugin_info['update_available'] = true;
                $plugin_info['new_version'] = $update_info->new_version;
                $plugin_info['update_package'] = $update_info->package;
            } else {
                $plugin_info['update_available'] = false;
            }
            
            $plugins_data[] = $plugin_info;
        }
        
        // تطبيق الفلاتر
        if (!empty($args['status'])) {
            $plugins_data = $this->filter_plugins_by_status($plugins_data, $args['status']);
        }
        
        if (!empty($args['search'])) {
            $plugins_data = $this->search_plugins($plugins_data, $args['search']);
        }
        
        // ترتيب النتائج
        $orderby = isset($args['orderby']) ? $args['orderby'] : 'name';
        $order = isset($args['order']) ? $args['order'] : 'ASC';
        $plugins_data = $this->sort_plugins($plugins_data, $orderby, $order);
        
        // التصفح (Pagination)
        $page = isset($args['page']) ? intval($args['page']) : 1;
        $per_page = isset($args['per_page']) ? intval($args['per_page']) : 50;
        
        $total = count($plugins_data);
        $offset = ($page - 1) * $per_page;
        $plugins_data = array_slice($plugins_data, $offset, $per_page);
        
        return array(
            'plugins' => $plugins_data,
            'total' => $total,
            'page' => $page,
            'per_page' => $per_page,
            'total_pages' => ceil($total / $per_page)
        );
    }

    /**
     * تحديث بلاجن من رابط خارجي
     */
    public function update_plugin_from_url($plugin_file, $download_url, $backup = true) {

        // التحقق من وجود البلاجن
        if (!$this->plugin_exists($plugin_file)) {
            return new WP_Error('plugin_not_found', 'Plugin not found');
        }
        
        // عمل نسخة احتياطية إذا كان مطلوباً
        if ($backup) {
            $backup_result = $this->backup_plugin($plugin_file);
            if (is_wp_error($backup_result)) {
                return $backup_result;
            }
        }
        
        // تحميل الملف المضغوط
        $temp_file = $this->download_plugin_file($download_url);
        if (is_wp_error($temp_file)) {
            return $temp_file;
        }
        
        // إلغاء تفعيل البلاجن مؤقتاً
        $was_active = is_plugin_active($plugin_file);
        if ($was_active) {
            deactivate_plugins($plugin_file, true);
        }
        
        // استخراج البلاجن الجديد
        $extract_result = $this->extract_plugin($temp_file, $plugin_file);
        
        // حذف الملف المؤقت
        @unlink($temp_file);
        
        if (is_wp_error($extract_result)) {
            // استعادة النسخة الاحتياطية
            if ($backup) {
                $this->restore_plugin_backup($plugin_file);
            }
            return $extract_result;
        }
        
        // إعادة تفعيل البلاجن إذا كان مفعلاً من قبل
        if ($was_active) {
            $activate_result = activate_plugin($plugin_file);
            if (is_wp_error($activate_result)) {
                return new WP_Error('activation_failed', 'Plugin updated but activation failed: ' . $activate_result->get_error_message());
            }
        }
        
        return array(
            'success' => true,
            'plugin' => $plugin_file,
            'message' => 'Plugin updated successfully',
            'was_active' => $was_active,
            'backup_created' => $backup
        );
    }
    
    /**
     * إعادة تنصيب بلاجن من المتجر
     */
    public function reinstall_plugin($plugin_file, $force = false) {
        
        // التحقق من وجود البلاجن
        if (!$this->plugin_exists($plugin_file)) {
            return new WP_Error('plugin_not_found', 'Plugin not found');
        }
        
        // الحصول على slug البلاجن
        $plugin_slug = $this->get_plugin_slug($plugin_file);
        if (!$plugin_slug) {
            return new WP_Error('invalid_plugin', 'Cannot determine plugin slug');
        }
        
        // التحقق من وجود البلاجن في المتجر
        $plugin_info = $this->get_plugin_info_from_api($plugin_slug);
        if (is_wp_error($plugin_info)) {
            return $plugin_info;
        }
        
        // حفظ حالة التفعيل
        $was_active = is_plugin_active($plugin_file);
        
        // عمل نسخة احتياطية
        $backup_result = $this->backup_plugin($plugin_file);
        if (is_wp_error($backup_result)) {
            return $backup_result;
        }
        
        // إلغاء تفعيل البلاجن
        if ($was_active) {
            deactivate_plugins($plugin_file, true);
        }
        
        // حذف البلاجن الحالي إذا كان force مفعل
        if ($force) {
            $this->delete_plugin_files($plugin_file);
        }
        
        // تحميل وتثبيت البلاجن من المتجر
        include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
        include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
        
        $upgrader = new Plugin_Upgrader(new WP_Ajax_Upgrader_Skin());
        $install_result = $upgrader->install($plugin_info->download_link);
        
        if (is_wp_error($install_result)) {
            // استعادة النسخة الاحتياطية
            $this->restore_plugin_backup($plugin_file);
            return $install_result;
        }
        
        // إعادة تفعيل البلاجن إذا كان مفعلاً من قبل
        if ($was_active) {
            $activate_result = activate_plugin($plugin_file);
            if (is_wp_error($activate_result)) {
                return new WP_Error('activation_failed', 'Plugin reinstalled but activation failed: ' . $activate_result->get_error_message());
            }
        }
        
        return array(
            'success' => true,
            'plugin' => $plugin_file,
            'message' => 'Plugin reinstalled successfully',
            'was_active' => $was_active,
            'version' => $plugin_info->version
        );
    }
    
    /**
     * تفعيل/إلغاء تفعيل بلاجن
     */
    public function toggle_plugin($plugin_file, $plugin_status, $network_wide = false) {
        
        if (!$this->plugin_exists($plugin_file)) {
            return new WP_Error('plugin_not_found', 'Plugin not found');
        }

        $is_active = true;

        switch($plugin_status) {
            case 'active':
                $is_active = false;
                break;

            case 'deactive':
                $is_active = true;
                break;
                
            case 'toggle':
                $is_active = is_plugin_active($plugin_file);
                break;
        }
        
        if ($is_active) {
            $result = deactivate_plugins($plugin_file, false, $network_wide);
            $action = 'deactivated';
        } else {
            $result = activate_plugin($plugin_file, '', $network_wide);
            $action = 'activated';
            
            if (is_wp_error($result)) {
                return $result;
            }
        }
        
        return array(
            'success' => true,
            'plugin' => $plugin_file,
            'action' => $action,
            'is_active' => !$is_active,
            'network_wide' => $network_wide
        );
    }
    

     /**
     * تفعيل/إلغاء تفعيل التحديثات التلقائية
     */
    public function auto_update_toggle_plugin($plugin_file, $status = 'toggle') {
        if (!$this->plugin_exists($plugin_file)) {
            return new WP_Error('plugin_not_found', 'Plugin not found');
        }

        // احصل على القائمة الحالية
        $auto_updates = (array) get_site_option('auto_update_plugins', []);

        $is_enabled = in_array($plugin_file, $auto_updates, true);

        switch ($status) {
            case 'enable':
                if (!$is_enabled) {
                    $auto_updates[] = $plugin_file;
                }
                $new_status = true;
                break;

            case 'disable':
                if ($is_enabled) {
                    $auto_updates = array_diff($auto_updates, [$plugin_file]);
                }
                $new_status = false;
                break;

            case 'toggle':
                if ($is_enabled) {
                    $auto_updates = array_diff($auto_updates, [$plugin_file]);
                    $new_status = false;
                } else {
                    $auto_updates[] = $plugin_file;
                    $new_status = true;
                }
                break;

            default:
                return new WP_Error('invalid_status', 'Invalid status value. Use enable, disable, or toggle.');
        }

        // حفظ الإعداد
        update_site_option('auto_update_plugins', array_values($auto_updates));

        return array(
            'success' => true,
            'plugin' => $plugin_file,
            'auto_update' => $new_status
        );
    }



    /**
     * حذف بلاجن
     */
    public function delete_plugin($plugin_file, $force = false) {      
        if (!$this->plugin_exists($plugin_file)) {
            return new WP_Error('plugin_not_found', 'Plugin not found');
        }
        
        if($force) {
            $this->toggle_plugin($plugin_file, 'deactive');
        }
        
        // التأكد من أن البلاجن غير مفعل
        if (is_plugin_active($plugin_file)) {
            return new WP_Error('plugin_active', 'Cannot delete active plugin. Please deactivate first.');
        }
        
        $plugin_dir = dirname($plugin_file);
        $plugin_path = WP_PLUGIN_DIR . '/' . $plugin_dir;
        
        // حذف مجلد البلاجن
        $deleted = $this->delete_directory($plugin_path);
        
        if (!$deleted) {
            return new WP_Error('deletion_failed', 'Failed to delete plugin files');
        }
        
        return array(
            'success' => true,
            'plugin' => $plugin_file,
            'message' => 'Plugin deleted successfully'
        );
    }
    
    // ===== المساعدات (Helper Methods) =====
    
    private function plugin_exists($plugin_file) {
        if (!function_exists('get_plugins')) {
            require_once ABSPATH . 'wp-admin/includes/plugin.php';
        }
        
        $plugins = get_plugins();
        return isset($plugins[$plugin_file]);
    }
    
    private function is_plugin_auto_update_enabled($plugin_file) {
        $auto_updates = get_option('auto_update_plugins', array());
        return in_array($plugin_file, $auto_updates);
    }
    
    private function get_plugin_update_info($plugin_file) {
        $current = get_site_transient('update_plugins');
        return isset($current->response[$plugin_file]) ? $current->response[$plugin_file] : false;
    }
    
    private function filter_plugins_by_status($plugins, $status) {
        return array_filter($plugins, function($plugin) use ($status) {
            switch ($status) {
                case 'active':
                    return $plugin['is_active'] || $plugin['is_network_active'];
                case 'inactive':
                    return !$plugin['is_active'] && !$plugin['is_network_active'];
                case 'update-available':
                    return $plugin['update_available'];
                default:
                    return true;
            }
        });
    }
    
    private function search_plugins($plugins, $search_term) {
        $search_term = strtolower($search_term);
        
        return array_filter($plugins, function($plugin) use ($search_term) {
            return strpos(strtolower($plugin['name']), $search_term) !== false ||
                   strpos(strtolower($plugin['description']), $search_term) !== false ||
                   strpos(strtolower($plugin['author']), $search_term) !== false;
        });
    }
    
    private function sort_plugins($plugins, $orderby, $order) {
        usort($plugins, function($a, $b) use ($orderby, $order) {
            $result = 0;
            
            switch ($orderby) {
                case 'name':
                    $result = strcmp($a['name'], $b['name']);
                    break;
                case 'version':
                    $result = version_compare($a['version'], $b['version']);
                    break;
                case 'author':
                    $result = strcmp($a['author'], $b['author']);
                    break;
                default:
                    $result = strcmp($a['name'], $b['name']);
            }
            
            return $order === 'DESC' ? -$result : $result;
        });
        
        return $plugins;
    }
    
    private function download_plugin_file($url) {
        $temp_file = download_url($url);
        
        if (is_wp_error($temp_file)) {
            return new WP_Error('download_failed', 'Failed to download plugin: ' . $temp_file->get_error_message());
        }
        
        return $temp_file;
    }
    
    private function extract_plugin($zip_file, $plugin_file) {
        WP_Filesystem();
        global $wp_filesystem;
        
        $plugin_dir = dirname($plugin_file);
        $destination = WP_PLUGIN_DIR . '/' . $plugin_dir;
        
        $result = unzip_file($zip_file, WP_PLUGIN_DIR);
        
        if (is_wp_error($result)) {
            return new WP_Error('extraction_failed', 'Failed to extract plugin: ' . $result->get_error_message());
        }
        
        return true;
    }
    
    private function backup_plugin($plugin_file) {
        $plugin_dir = dirname($plugin_file);
        $source = WP_PLUGIN_DIR . '/' . $plugin_dir;
        $backup_dir = WP_CONTENT_DIR . '/plugin-backups';

        if (!file_exists($backup_dir)) {
            wp_mkdir_p($backup_dir);
        }

        $timestamp = date('Y-m-d-H-i-s');

        // إذا توفر zip استخدمه
        if (class_exists('ZipArchive')) {
            $backup_path = $backup_dir . '/' . $plugin_dir . '-' . $timestamp . '.zip';
            return $this->zip_directory($source, $backup_path);
        } else {
            // fallback إلى النسخ العادي
            $backup_path = $backup_dir . '/' . $plugin_dir . '-' . $timestamp;
            return $this->copy_directory($source, $backup_path);
        }
    }

    private function zip_directory($source, $zip_path) {
        if (!class_exists('ZipArchive')) {
            return new WP_Error('missing_zip', 'ZipArchive is not available on this server.');
        }

        $source = realpath($source);
        if (!is_dir($source)) {
            return new WP_Error('invalid_source', 'Plugin directory not found.');
        }

        $zip = new ZipArchive();
        if ($zip->open($zip_path, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
            return new WP_Error('zip_failed', 'Failed to create ZIP archive.');
        }

        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::LEAVES_ONLY
        );

        foreach ($iterator as $file) {
            $file_path = $file->getRealPath();
            $relative_path = substr($file_path, strlen($source) + 1);
            $zip->addFile($file_path, $relative_path);
        }

        $zip->close();

        return $zip_path;
    }

    
    private function restore_plugin_backup($plugin_file) {
        // منطق استعادة النسخة الاحتياطية
        // يمكن تطويره حسب الحاجة
        return true;
    }
    
    private function get_plugin_slug($plugin_file) {
        $plugin_dir = dirname($plugin_file);
        return $plugin_dir !== '.' ? $plugin_dir : pathinfo($plugin_file, PATHINFO_FILENAME);
    }
    
    private function get_plugin_info_from_api($plugin_slug) {
        include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
        
        $api = plugins_api('plugin_information', array('slug' => $plugin_slug));
        
        if (is_wp_error($api)) {
            return new WP_Error('api_error', 'Plugin not found in WordPress repository');
        }
        
        return $api;
    }
    
    private function delete_plugin_files($plugin_file) {
        $plugin_dir = dirname($plugin_file);
        $plugin_path = WP_PLUGIN_DIR . '/' . $plugin_dir;
        
        return $this->delete_directory($plugin_path);
    }
    
    private function copy_directory($source, $destination) {
        WP_Filesystem();
        global $wp_filesystem;
        
        return copy_dir($source, $destination);
    }
    
    private function delete_directory($directory) {
        WP_Filesystem();
        global $wp_filesystem;
        
        return $wp_filesystem->delete($directory, true);
    }
}