<?php

declare(strict_types=1);

/**
 * Handles custom roles and capabilities for the HVAC Community Events plugin
 */

if (!defined('ABSPATH')) {
    exit;
}

class HVAC_Roles {
    /**
     * Create the hvac_trainer role with all required capabilities
     */
    public function create_trainer_role() {
        // Check if role already exists
        if (get_role('hvac_trainer')) {
            return true;
        }
        
        // Add the role with capabilities
        $result = add_role(
            'hvac_trainer',
            __('HVAC Trainer', 'hvac-community-events'),
            $this->get_trainer_capabilities()
        );
        
        return $result !== null;
    }
    
    /**
     * Create the hvac_master_trainer role with all required capabilities
     */
    public function create_master_trainer_role() {
        // Check if role already exists
        if (get_role('hvac_master_trainer')) {
            // Role exists, update it with new capabilities
            return $this->update_master_trainer_role();
        }
        
        // Add the role with capabilities
        $result = add_role(
            'hvac_master_trainer',
            __('HVAC Master Trainer', 'hvac-community-events'),
            $this->get_master_trainer_capabilities()
        );
        
        return $result !== null;
    }
    
    /**
     * Update existing hvac_master_trainer role with new capabilities
     */
    public function update_master_trainer_role() {
        $role = get_role('hvac_master_trainer');
        if (!$role) {
            return false;
        }
        
        // Get all required capabilities
        $required_caps = $this->get_master_trainer_capabilities();
        
        // Add any missing capabilities
        foreach ($required_caps as $cap => $grant) {
            if ($grant && !$role->has_cap($cap)) {
                $role->add_cap($cap);
            }
        }
        
        return true;
    }
    
    /**
     * Remove the hvac_trainer role
     */
    public function remove_trainer_role() {
        remove_role('hvac_trainer');
    }
    
    /**
     * Remove the hvac_master_trainer role
     */
    public function remove_master_trainer_role() {
        remove_role('hvac_master_trainer');
    }
    
    /**
     * Get all capabilities for the trainer role
     */
    public function get_trainer_capabilities() {
        $caps = [
            // Basic WordPress capabilities
            'read' => true,
            'upload_files' => true,
            
            // Custom HVAC capabilities
            'manage_hvac_events' => true,
            'edit_hvac_profile' => true,
            'view_hvac_dashboard' => true,
            'manage_attendees' => true,
            'email_attendees' => true,
            'hvac_trainer_templates_view' => true,
            
            // The Events Calendar capabilities
            'publish_tribe_events' => true,
            'edit_tribe_events' => true,
            'delete_tribe_events' => true,
            'edit_published_tribe_events' => true,
            'delete_published_tribe_events' => true,
            'read_private_tribe_events' => true,
        ];
        
        // Explicitly deny admin capabilities
        $denied_caps = [
            'manage_options',
            'moderate_comments',
            'manage_categories',
            'manage_links',
            'edit_others_posts',
            'edit_pages',
            'edit_others_pages',
            'edit_published_pages',
            'publish_pages',
            'delete_pages',
            'delete_others_pages',
            'delete_published_pages',
            'delete_others_posts',
            'import',
            'export',
            'edit_theme_options',
        ];
        
        foreach ($denied_caps as $cap) {
            $caps[$cap] = false;
        }
        
        return $caps;
    }
    
    /**
     * Get all capabilities for the master trainer role
     */
    public function get_master_trainer_capabilities() {
        // Start with all trainer capabilities
        $caps = $this->get_trainer_capabilities();
        
        // Add master trainer specific capabilities
        $master_caps = [
            'view_master_dashboard' => true,
            'view_all_trainer_data' => true,
            'manage_google_sheets_integration' => true,
            'view_global_analytics' => true,
            'manage_communication_templates' => true,
            'manage_communication_schedules' => true,
            
            // Missing capabilities that were causing menu filtering
            'view_all_events' => true,
            'hvac_master_events_view' => true,
            'approve_trainers' => true,
            'manage_announcements' => true,
            'import_export_data' => true,
        ];
        
        // Merge with trainer capabilities
        $caps = array_merge($caps, $master_caps);
        
        return $caps;
    }
    
    /**
     * Grant administrators access to HVAC dashboard capabilities
     * This prevents redirect loops when admins try to access the dashboard
     */
    public function grant_admin_dashboard_access() {
        $admin_role = get_role('administrator');
        if ($admin_role) {
            $admin_role->add_cap('view_hvac_dashboard');
            $admin_role->add_cap('manage_hvac_events');
            $admin_role->add_cap('view_master_dashboard');
            $admin_role->add_cap('view_all_trainer_data');
            $admin_role->add_cap('manage_google_sheets_integration');
            $admin_role->add_cap('view_global_analytics');
            $admin_role->add_cap('manage_communication_templates');
            $admin_role->add_cap('manage_communication_schedules');
            $admin_role->add_cap('view_all_events');
            $admin_role->add_cap('hvac_master_events_view');
            $admin_role->add_cap('approve_trainers');
            $admin_role->add_cap('manage_announcements');
            $admin_role->add_cap('import_export_data');
            $admin_role->add_cap('hvac_trainer_templates_view');
            return true;
        }
        return false;
    }
    
    /**
     * Remove HVAC dashboard capabilities from administrators
     */
    public function revoke_admin_dashboard_access() {
        $admin_role = get_role('administrator');
        if ($admin_role) {
            $admin_role->remove_cap('view_hvac_dashboard');
            $admin_role->remove_cap('manage_hvac_events');
            $admin_role->remove_cap('view_master_dashboard');
            $admin_role->remove_cap('view_all_trainer_data');
            $admin_role->remove_cap('manage_google_sheets_integration');
            $admin_role->remove_cap('view_global_analytics');
            $admin_role->remove_cap('manage_communication_templates');
            $admin_role->remove_cap('manage_communication_schedules');
            $admin_role->remove_cap('view_all_events');
            $admin_role->remove_cap('approve_trainers');
            $admin_role->remove_cap('manage_announcements');
            $admin_role->remove_cap('import_export_data');
            $admin_role->remove_cap('hvac_trainer_templates_view');
        }
    }
    
    /**
     * Check if current user has a specific HVAC trainer capability
     */
    public static function check_trainer_capability($capability) {
        return current_user_can($capability);
    }
}