var instanceName = gs.getProperty('instance_name');
if (instanceName !== 'testinstance') {
    gs.info('This is not the specified instance.');
    current.comments = 'This is not the specified instance';
    current.setWorkflow(true);
    return;
}
var description = current.getValue('description');
var role = '';
var action = '';
var email = '';
var comments = ''; // Variable to accumulate comments
var actionTaken = false; // Track if any action was taken
// Regular expression patterns
var emailPattern = /Email:\s*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i;
var rolePattern = /Role:\s*(.*)/i;
var addActionPattern = /Add\s*new\s*role/i;
var removeActionPattern = /Remove\s*role/i;
var renewActionPattern = /Renew\s*role/i;
// Extract email
var emailMatch = description.match(emailPattern);
if (emailMatch) {
    email = emailMatch[1];
} else {
    gs.info('Email not found in description.');
    comments += 'Correct email not found in description. Incident not resolved\n';
    current.comments = comments;
    current.setWorkflow(true);
    return; // Abort further execution
}
// Extract role
var roleMatch = description.match(rolePattern);
if (roleMatch && roleMatch.length > 1) {
    role = roleMatch[1].trim();
} else {
    gs.info('Role not found in description.');
    comments += 'Role not found in description. Incident not resolved\n';
    current.comments = comments;
    current.setWorkflow(true);
    return; // Abort further execution
}
// Extract action
if (description.match(addActionPattern)) {
    action = 'add';
} else if (description.match(removeActionPattern)) {
    action = 'remove';
} else if (description.match(renewActionPattern)) {
    action = 'renew';
} else {
    gs.info('Action not recognized.');
    comments += 'Action not recognized. Incident not resolved\n';
    current.comments = comments;
    current.setWorkflow(true);
    return; // Abort further execution
}
// Get the sys_id of the user
var emailGR = new GlideRecord('sys_user');
emailGR.addQuery('email', email);
emailGR.addNotNullQuery('email');
emailGR.query();
if (!emailGR.next()) {
    gs.info('User not found for email: ' + email);
    comments += 'Email not found, hence Incident not resolved\n';
    current.comments = comments;
    current.setWorkflow(true);
    return; // Abort further execution
}
var userId = emailGR.sys_id;
var userName = emailGR.user_name;
// Check if user is internal (user id starts with n[0-9][0-9]* or m[0-9][0-9]*)
var isInternal = /^n[0-9]+|^m[0-9]+/.test(userName);
// Get the sys_id of the group
var groupGR = new GlideRecord('sys_user_group');
groupGR.addQuery('name', role);
groupGR.query();
if (!groupGR.next()) {
    gs.info('Group not found for role: ' + role);
    comments += 'Mentioned group not found. Incident not resolved\n';
    current.comments = comments;
    current.setWorkflow(true);
    return; // Abort further execution
}
var groupId = groupGR.sys_id;
// Check if the user is already a member of the group
var groupMemberGR = new GlideRecord('sys_user_grmember');
groupMemberGR.addQuery('user', userId);
groupMemberGR.addQuery('group', groupId);
groupMemberGR.query();
var isMember = groupMemberGR.hasNext();
if (action === 'add' || action === 'renew') {
    if (!isMember) {
        // Attempt to add the user to the group
        var newGroupMemberGR = new GlideRecord('sys_user_grmember');
        newGroupMemberGR.initialize();
        newGroupMemberGR.user = userId;
        newGroupMemberGR.group = groupId;
        newGroupMemberGR.insert();
        
        // Verify if the user has been added successfully
        groupMemberGR.initialize();
        groupMemberGR.addQuery('user', userId);
        groupMemberGR.addQuery('group', groupId);
        groupMemberGR.query();
        if (groupMemberGR.hasNext()) {
            comments += 'User successfully added to the group. Incident resolved\n';
            actionTaken = true; // Mark that an action was successfully taken
        } else {
            comments += 'Attempt to add user failed. Incident remains open\n';
        }
        // Handle the case for internal users and ITIL role
        if (isInternal && role === ' ITIL') {
            var paUserGroupGR = new GlideRecord('sys_user_group');
            paUserGroupGR.addQuery('name', 'PA User Internal');
            paUserGroupGR.query();
            if (paUserGroupGR.next()) {
                var paGroupId = paUserGroupGR.sys_id;
                var paGroupMemberGR = new GlideRecord('sys_user_grmember');
                paGroupMemberGR.initialize();
                paGroupMemberGR.user = userId;
                paGroupMemberGR.group = paGroupId;
                paGroupMemberGR.insert();
                // Verify if user was added to the PA group
                paGroupMemberGR.initialize();
                paGroupMemberGR.addQuery('user', userId);
                paGroupMemberGR.addQuery('group', paGroupId);
                paGroupMemberGR.query();
                if (paGroupMemberGR.hasNext()) {
                    comments += 'User added to both ITIL and  PA User Internal groups.\n';
                } else {
                    comments += 'Failed to add user to PA User group.\n';
                }
            }
        }
    } else {
        gs.info('User is already a member of the group.');
        comments += 'User is already a member of the group. No changes made\n';
    }
} else if (action === 'remove') {
    if (isMember) {
        // Attempt to remove the user from the group
        while (groupMemberGR.next()) {
            groupMemberGR.deleteRecord();
        }
        
        // Verify if the user was successfully removed
        groupMemberGR.initialize();
        groupMemberGR.addQuery('user', userId);
        groupMemberGR.addQuery('group', groupId);
        groupMemberGR.query();
        if (!groupMemberGR.hasNext()) {
            comments += 'User successfully removed from the group. Incident resolved\n';
            actionTaken = true; // Mark that an action was successfully taken
        } else {
            comments += 'Attempt to remove user failed. Incident remains open\n';
        }
    } else {
        gs.info('User is not a member of the group.');
        comments += 'User is not a member of the group. No changes made\n';
    }
}
comments += '\nUser ID: ' + userName;
// Only resolve the incident if an action was actually taken (add or remove)
if (actionTaken) {
    current.state = 6; // 6 is the state value for "Resolved"
    current.incident_state = 6;
    current.close_code = 'Closed/Resolved by automation'; // Example resolution code
    current.close_notes = 'Completed Successfully';
    current.assigned_to = 'testuser';
} else {
    comments += 'No changes made. User was neither added nor removed. Incident remains open.\n';
}
// Set the accumulated comments and update once at the end
current.comments = comments;
current.update();
current.setWorkflow(true);