/*
 * Decompiled with CFR 0.152.
 * 
 * Could not load the following classes:
 *  com.l7tech.identity.Group
 *  com.l7tech.identity.GroupBean
 *  com.l7tech.identity.GroupMembership
 *  com.l7tech.identity.Identity
 *  com.l7tech.identity.internal.InternalGroup
 *  com.l7tech.identity.internal.InternalGroupMembership
 *  com.l7tech.identity.internal.InternalUser
 *  com.l7tech.objectmodel.DeleteException
 *  com.l7tech.objectmodel.EntityType
 *  com.l7tech.objectmodel.Goid
 *  com.l7tech.objectmodel.IdentityHeader
 *  com.l7tech.objectmodel.UpdateException
 *  com.l7tech.util.ExceptionUtils
 *  jakarta.persistence.criteria.CriteriaBuilder
 *  jakarta.persistence.criteria.Expression
 *  jakarta.persistence.criteria.Predicate
 *  jakarta.persistence.criteria.Root
 *  org.springframework.transaction.annotation.Propagation
 *  org.springframework.transaction.annotation.Transactional
 */
package com.l7tech.server.identity.internal;

import com.l7tech.identity.Group;
import com.l7tech.identity.GroupBean;
import com.l7tech.identity.GroupMembership;
import com.l7tech.identity.Identity;
import com.l7tech.identity.internal.InternalGroup;
import com.l7tech.identity.internal.InternalGroupMembership;
import com.l7tech.identity.internal.InternalUser;
import com.l7tech.objectmodel.DeleteException;
import com.l7tech.objectmodel.EntityType;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.IdentityHeader;
import com.l7tech.objectmodel.UpdateException;
import com.l7tech.server.identity.PersistentGroupManagerImpl;
import com.l7tech.server.identity.internal.InternalGroupManager;
import com.l7tech.server.identity.internal.InternalIdentityProvider;
import com.l7tech.server.identity.internal.InternalUserManager;
import com.l7tech.server.security.rbac.RoleManager;
import com.l7tech.util.ExceptionUtils;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Transactional(propagation=Propagation.REQUIRED, rollbackFor={Throwable.class})
public class InternalGroupManagerImpl
extends PersistentGroupManagerImpl<InternalUser, InternalGroup, InternalUserManager, InternalGroupManager>
implements InternalGroupManager {
    private final RoleManager t;
    private static final String[] u;

    public InternalGroupManagerImpl(RoleManager roleManager) {
        this.t = roleManager;
    }

    @Override
    public void configure(InternalIdentityProvider internalIdentityProvider) {
        this.setIdentityProvider(internalIdentityProvider);
    }

    public InternalGroup reify(GroupBean groupBean) {
        InternalGroup internalGroup = new InternalGroup(groupBean.getName());
        internalGroup.setDescription(groupBean.getDescription());
        internalGroup.setGoid(groupBean.getId() == null ? InternalGroup.DEFAULT_GOID : Goid.parseGoid((String)groupBean.getId()));
        return internalGroup;
    }

    @Override
    public GroupMembership newMembership(InternalGroup internalGroup, InternalUser internalUser) {
        Goid goid = Goid.parseGoid((String)internalGroup.getId());
        Goid goid2 = Goid.parseGoid((String)internalUser.getId());
        return InternalGroupMembership.newInternalMembership((Goid)goid, (Goid)goid2);
    }

    @Override
    public Class getMembershipClass() {
        return InternalGroupMembership.class;
    }

    @Override
    @Transactional(propagation=Propagation.SUPPORTS)
    public InternalGroup cast(Group group) {
        if (group instanceof GroupBean) {
            return this.reify((GroupBean)group);
        }
        return (InternalGroup)group;
    }

    @Override
    public String getTableName() {
        return u[0];
    }

    public Class<InternalGroup> getImpClass() {
        return InternalGroup.class;
    }

    @Override
    public Class<Group> getInterfaceClass() {
        return Group.class;
    }

    @Override
    protected IdentityHeader newHeader(InternalGroup internalGroup) {
        return new IdentityHeader(this.identityProvider != null ? this.getProviderGoid() : internalGroup.getProviderId(), internalGroup.getGoid(), EntityType.GROUP, internalGroup.getName(), internalGroup.getDescription(), null, internalGroup.getVersion(), internalGroup.isEnabled());
    }

    @Override
    protected Predicate addMembershipPredicate(Predicate predicate, CriteriaBuilder criteriaBuilder, Root<GroupMembership> root, Group group, Identity identity) {
        return criteriaBuilder.and((Expression)predicate, (Expression)criteriaBuilder.equal((Expression)root.get(u[1]), (Object)identity.getProviderId()));
    }

    @Override
    protected void preDelete(InternalGroup internalGroup) throws DeleteException {
    }

    @Override
    protected void postDelete(InternalGroup internalGroup) throws DeleteException {
        try {
            if (internalGroup != null) {
                this.t.deleteRoleAssignmentsForGroup((Group)internalGroup);
            }
        }
        catch (UpdateException updateException) {
            throw InternalGroupManagerImpl.a(updateException);
        }
        try {
            this.t.validateRoleAssignments();
        }
        catch (UpdateException updateException) {
            throw new DeleteException(ExceptionUtils.getMessage((Throwable)updateException), (Throwable)updateException);
        }
    }

    @Override
    protected void postUpdate(InternalGroup internalGroup) throws UpdateException {
        this.t.validateRoleAssignments();
    }

    private static UpdateException a(UpdateException updateException) {
        return updateException;
    }

    /*
     * Enabled aggressive block sorting
     */
    static {
        String[] stringArray = new String[2];
        int n2 = 0;
        String string = "e\u0007D\u000fF<\u0013`6W\u0018['\u0002\u0012a\f]\bQ \"~\u0006F\u0003P7\u0000K\u0006Y\u000e";
        int n3 = "e\u0007D\u000fF<\u0013`6W\u0018['\u0002\u0012a\f]\bQ \"~\u0006F\u0003P7\u0000K\u0006Y\u000e".length();
        int n4 = 14;
        int n5 = -1;
        while (true) {
            int n6 = ++n5;
            stringArray[n2++] = InternalGroupManagerImpl.c(86, InternalGroupManagerImpl.d(string.substring(n6, n6 + n4)));
            if ((n5 += n4) >= n3) {
                u = stringArray;
                return;
            }
            n4 = string.charAt(n5);
        }
    }

    private static char[] d(String string) {
        char[] cArray = string.toCharArray();
        if (cArray.length < 2) {
            cArray = cArray;
            cArray[0] = (char)(cArray[0] ^ 0x24);
        }
        return cArray;
    }

    /*
     * Handled impossible loop by duplicating code
     * Enabled aggressive block sorting
     */
    private static String c(int n2, char[] cArray) {
        char[] cArray2;
        block11: {
            int n3;
            int n4;
            int n5;
            block10: {
                n5 = n2;
                cArray2 = cArray;
                n4 = cArray.length;
                n3 = 0;
                if (!true) break block10;
                n4 = n4;
                if (n4 <= n3) break block11;
            }
            do {
                n5 = n5;
                cArray2 = cArray2;
                int n6 = n3;
                cArray2[n6] = (char)(cArray2[n6] ^ (n5 ^ (switch (n3 % 7) {
                    case 0 -> 90;
                    case 1 -> 63;
                    case 2 -> 102;
                    case 3 -> 60;
                    case 4 -> 98;
                    case 5 -> 4;
                    default -> 36;
                })));
                ++n3;
                n4 = n4;
            } while (n4 > n3);
        }
        return new String(cArray2).intern();
    }
}

