<?php
/** @var xPDOTransport $transport */
/** @var array $options */
/** @var modX $modx */
use MODX\Revolution\modX;
use JustKnit\Model\JustKnitProduct;
use MODX\Revolution\modUserGroup;
use MODX\Revolution\modAccessResourceGroup;
use MODX\Revolution\modAccessContext;
use xPDO\Transport\xPDOTransport;
$jkproducts = [];
$jkproduct = '';
$productUserGroup = 0;
$i = 0;

$jkproducts[++$i] = [
    'product_id' => '409169',
    'product_name' => 'Basis',
    'modxusergroup' => $productUserGroup,
    'duration' => '1month',
];

$jkproducts[++$i] = [
    'product_id' => '409847',
    'product_name' => 'Klassik',
    'modxusergroup' => $productUserGroup,
    'duration' => '3 Monate',
];

$jkproducts[++$i] = [
    'product_id' => '409849',
    'product_name' => 'Premium',
    'modxusergroup' => $productUserGroup,
    'duration' => '12months',
];

$jkproducts[++$i] = [
    'product_id' => '490135',
    'product_name' => 'Business',
    'modxusergroup' => $productUserGroup,
    'duration' => '12months',
];

$jkproducts[++$i] = [
    'product_id' => '490133',
    'product_name' => 'VIP',
    'modxusergroup' => $productUserGroup,
    'duration' => '6months',
];

$jkproducts[++$i] = [
    'product_id' => '490139',
    'product_name' => 'PullunderEasy',
    'modxusergroup' => $productUserGroup,
    'duration' => '1month',
    ];
/**
 * Bei Update nicht erforderlich. Sonst werden die Gruppen doppelt erstellt.
 */
$jkgroups = [];
$i = 0;
$jkgroups[++$i] = [
'name' => 'jkBasis',
'description' => 'Basis Zugang zum Strickrechner von JustKnit',
];

$jkgroups[++$i] = [
'name' => 'jkKlassik',
'description' => 'Klassik Zugang zum Strickrechner von JustKnit',
];

$jkgroups[++$i] = [
'name' => 'jkPremium',
'description' => 'Premium Zugang zum Strickrechner von JustKnit',
];

$jkgroups[++$i] = [
'name' => 'jkVIP',
'description' => 'VIP Zugang zum Strickrechner von JustKnit',
];

$jkgroups[++$i] = [
'name' => 'jkBusiness',
'description' => 'Business Zugang zum Strickrechner von JustKnit',
];

$jkgroups[++$i] = [
'name' => 'jkPullunderEasy',
'description' => 'Modell: Pullunder nach deinen individuellen Maßen',
];
$jkgroups[++$i] = [
'name' => 'jkCalc',
'description' => 'Übergeordnete Gruppe für die Berechnungen',
];

$jkgroups[++$i] = [
'name' => 'jkModell',
'description' => 'Übergeordnete Gruppe für Modell Berechnungen',
];

$jkdocgroupnames = [];
$i = 0;
$jkdocgroupnames[++$i] = [
'name' => 'jkCalc',
];
$jkdocgroupnames[++$i] = [
'name' => 'jkProject',
];
// 3 	Load Only
// 4 	Load, List and View

$accessanonym = [
    'principal_class' => 'MODX\\Revolution\\modUserGroup',
    'principal' => '0',
    //'target' set by ResourceGroup
    'authority' => '9999',
    'policy' => '3',
    'context_key' => 'justknit'
];
$accesscontext = [
    'target' => 'justknit',
    'principal_class' => 'MODX\\Revolution\\modUserGroup',
    //principal set by userGroup
    'authority' => '9999',
    'policy' => '4',
];

$accessuserresource = [
    // target set by resourceGroup
    'principal_class' => 'MODX\\Revolution\\modUserGroup',
    // principal set by userGroup
    'authority' => '9999',
    'policy' => '4',
    'context_key' => 'justknit'
];

$assignments = [];
$i = 0;
$assignments[++$i] = [
    'user' => 'jkBasis',
    'resource' => 'jkCalc',
];
$assignments[++$i] = [
    'user' => 'jkKlassik',
    'resource' => 'jkCalc',
];
$assignments[++$i] = [
    'user' => 'jkPremium',
    'resource' => 'jkCalc',
];

if ($transport->xpdo) {
    $modx = &$transport->xpdo;

    switch ($options[xPDOTransport::PACKAGE_ACTION]) {
        case xPDOTransport::ACTION_INSTALL:
        case xPDOTransport::ACTION_UPGRADE:
            // Commonly similar actions for install and upgrade
            // New modUserGroup for each product (modUserGroup - table="membergroup_names")
            foreach ($jkgroups as $key => $fieldvalues) {
                $jkgroup = $modx->getObject(modUserGroup::class, ['name' => $fieldvalues['name']]);
                if ($jkgroup) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> UserGroup ' . $fieldvalues['name'] . ' already exists.');
                } else {
                    $jkgroup = $modx->newObject(modUserGroup::class);
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> new UserGroup: ' . $fieldvalues['name'] . ' will be created.' );
                }
/*                if (!is_object($jkgroup)) {
                    $jkgroup = $modx->newObject(modUserGroup::class);
                    $modx->log(
                        modX::LOG_LEVEL_INFO,
                        '-> new UserGroup: ' . $fieldvalues['name']
                    );
                } else {
                    $modx->log(modX::LOG_LEVEL_INFO, '-> existing UserGroup: ' . $fieldvalues['name']);
                }
*/
                $jkgroup->set('name',$fieldvalues['name']);
                $jkgroup->set('description',$fieldvalues['description']);
                if ($jkgroup->save()) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> saved UserGroup: ' . $fieldvalues['name'] );
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR,
                        '-> could not save UserGroup: ' . $fieldvalues['name'] );
                }
                // give context access "Load, List and View - 4" to UserGroup (modAccessContext - table="access_context")
                $accesscontext['principal'] = $jkgroup->get('id');
                $access = $modx->getObject(modAccessContext::class,$accesscontext);
                //SELECT * FROM `rv_access_context` where `target` ='justknit' and `principal_class`= 'MODX\\Revolution\\modUserGroup' and `principal` = 2 and `authority`= '9999' and `policy` = '4'
                if ($access) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> UserGroup ' . $fieldvalues['name'] . ' has already access to context ' . $accesscontext['target'] . '.');
                } else {
                    $access = $modx->newObject(modAccessContext::class);
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> UserGroup ' . $fieldvalues['name'] . 'has NOT already access to load, list, view of context: justknit, New ACL');
                }
                $access->fromArray($accesscontext);
                if ($access->save()) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> UserGroup has access to load, list, view of context: justknit saved');
                } else {
                    $modx->log(
                        modX::LOG_LEVEL_ERROR,
                        '-> could not install ACL for New UserGroup to context: justknit'
                    );
                }
                unset($access);
            }

            // New resource groups modResourceGroup to later add the resources (modResourceGroup - table="documentgroup_names")
            foreach ($jkdocgroupnames as $key => $fieldvalues) {
                $jkdocgroupname = $modx->getObject(modResourceGroup::class, ['name' => $fieldvalues['name']]);
                if ($jkdocgroupname) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> ResourceGroup ' . $fieldvalues['name'] . ' already exists.');
                } else {
                    $jkdocgroupname = $modx->newObject(modResourceGroup::class);
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> NEW ResourceGroup ' . $fieldvalues['name'] );
                }
                $jkdocgroupname->set('name',$fieldvalues['name']);
                if ($jkdocgroupname->save()) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> saved ResourceGroup: ' . $fieldvalues['name']
                    );
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR,
                        '-> could not save ResourceGroup: ' . $fieldvalues['name']
                    );
                }
                // give 3 -> Load Only access to anonymous User
                // (modAccessResourceGroup table="access_resource_groups")
                $accessanonym['target'] = $jkdocgroupname->get('id');
                $access = $modx->getObject(modAccessResourceGroup::class, $accessanonym);
                if ($access) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> UserGroup anonymous has already access to ResourceGroup ' . $fieldvalues['name'] . '.');
                } else {
                    $access = $modx->newObject(modAccessResourceGroup::class);
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> UserGroup anonymous has already access to ResourceGroup ' . $fieldvalues['name'] . '.');
                }
                $access->fromArray($accessanonym);
                if ($access->save()) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> anonymous user has access to "Load Only" ResourceGroup: ' . $fieldvalues['name']);
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR,
                        '-> could not save ACL "Load Only" for anonymous user for ResourceGroup: ' . $fieldvalues['name']);
                }
                unset($access);
            }
            // Add new modUserGroup access to new modResourceGroup
            //(modAccessResourceGroup -> table="access_resource_groups")
            foreach ($assignments as $key => $fieldvalues) {
                $userass = $modx->getObject(modUserGroup::class, ['name' => $fieldvalues['user']]);
                $resourceass = $modx->getObject(modResourceGroup::class, ['name' => $fieldvalues['resource']]);
                if (is_object($userass) && is_object($resourceass)) {
                    $accessuserresource['target'] = $resourceass->get('id');
                    $accessuserresource['principal'] = $userass->get('id');
                    $access = $modx->getObject(modAccessResourceGroup::class, $accessuserresource);
                    if ($access) {
                        $modx->log(modX::LOG_LEVEL_INFO,
                            '-> UserGroup ' . $fieldvalues['user']. ' has already access to ResourceGroup ' .$fieldvalues['resource'] . '.');
                    } else {
                        $modx->log(modX::LOG_LEVEL_INFO,
                            '-> New ACL for UserGroup ' . $fieldvalues['user']. ' to ResourceGroup ' .$fieldvalues['resource'] . '.');
                        $access = $modx->newObject(modAccessResourceGroup::class);
                    }
                    $access->fromArray($accessuserresource);
                    if ($access->save()) {
                        $modx->log(modX::LOG_LEVEL_INFO,
                            '-> UserGroup ' . $fieldvalues['user'] . ' has access to "Load, List and View" for ResourceGroup ' . $fieldvalues['resource']);
                    } else {
                        $modx->log(modX::LOG_LEVEL_ERROR,
                            '-> could not save ACL "Load, List and View" for UserGroup ' . $fieldvalues['user'] . ' to ResourceGroup: ' . $fieldvalues['resource']);
                    }
                    unset($access);
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR,
                        '-> could not install ACL "Load, List and View" for UserGroup ' . $fieldvalues['user'] . ' to ResourceGroup ' . $fieldvalues['resource'] . '. UserGroup or ResourceGroup not found.');
                }
            }
            foreach ($jkproducts as $key => $fieldvalues) {
                $jkproduct = $modx->getObject(JustKnitProduct::class, ['product_name' => $fieldvalues['product_name']]);
                if (!is_object($jkproduct)) {
                    $jkproduct = $modx->newObject(JustKnitProduct::class);
                }
                $group = $modx->getObject(modUserGroup::class, ['name' => 'jk'.$fieldvalues['product_name']]);
                if (!is_object($group)) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> New Group not found : ' . 'jk'.$fieldvalues['product_name']);
                } else {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> related Group : ' . 'jk'.$fieldvalues['product_name']);
                }
                $jkproduct->set('product_id',$fieldvalues['product_id']);
                $jkproduct->set('product_name',$fieldvalues['product_name']);
                $jkproduct->set('duration',$fieldvalues['duration']);
                $jkproduct->set('modxusergroup',$group->get('id'));
                if ($jkproduct->save()) {
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> installed product: ' . $fieldvalues['product_name']);
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR,
                        '-> could not install product: ' . $fieldvalues['product_name']);
                }
            }
            break;
        case xPDOTransport::ACTION_UNINSTALL:
            // Any uninstall cleanup needed?
            foreach ($jkgroups as $key => $fieldvalues) {
                $jkgroup = $modx->getObject(modUserGroup::class, ['name' => $fieldvalues['name']]);
                if (is_object($jkgroup)) {
                //$jkgroup->remove();
                $modx->log(modX::LOG_LEVEL_INFO,
                    '-> will not be removed: ' . $fieldvalues['name']. '. Please remove manually.');
                    
                }
            }
            foreach ($jkproducts as $key => $fieldvalues) {
                $jkproduct = $modx->getObject(JustKnitProduct::class, ['product_name' => $fieldvalues['product_name']]);
                if (is_object($jkproduct)) {
                    //$jkproduct->remove();
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> will not be removed: ' . $fieldvalues['product_name']. '. Please remove manually.');
                }
            }
            foreach ($jkdocgroupnames as $key => $fieldvalues) {
                $jkdocgroupname = $modx->getObject(modResourceGroup::class, ['name' => $fieldvalues['name']]);
                if (is_object($jkdocgroupname)) {
                    //$jkdocgroupname->remove();
                    $modx->log(modX::LOG_LEVEL_INFO,
                        '-> will not be removed: ' . $fieldvalues['name']. '. Please remove manually.');
                }
            }
            break;
    }
}
return true;


