/*
 * Copyright (C) 2000 - 2024 Silverpeas
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * As a special exception to the terms and conditions of version 3.0 of
 * the GPL, you may redistribute this Program in connection with Free/Libre
 * Open Source Software ("FLOSS") applications as described in Silverpeas's
 * FLOSS exception. You should have received a copy of the text describing
 * the FLOSS exception, and it is also available here:
 * "http://www.silverpeas.org/docs/core/legal/floss_exception.html"
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
 */
package org.silverpeas.components.kmelia;

import org.silverpeas.components.kmelia.service.KmeliaHelper;
import org.silverpeas.core.admin.service.OrganizationControllerProvider;
import org.silverpeas.core.admin.user.model.SilverpeasRole;
import org.silverpeas.core.admin.user.model.User;
import org.silverpeas.core.node.model.NodePK;
import org.silverpeas.kernel.util.StringUtil;

public class KmeliaPublicationHelper {

  private KmeliaPublicationHelper() {
  }

  public static boolean isUserConsideredAsOwner(String instanceId, String currentUserId,
      String profile, User ownerDetail) {
    if (hasWritePrivilege(currentUserId, profile, ownerDetail)) {
      return true;
    } else if ("writer".equals(profile)) {
      // check if co-writing is enabled
      return StringUtil.getBooleanValue(
          getParameterValue(instanceId, InstanceParameters.coWriting));
    }
    return false;
  }

  public static boolean isRemovable(String instanceId, String currentUserId, String profile,
      User ownerDetail) {
    if (hasWritePrivilege(currentUserId, profile, ownerDetail)) {
      boolean removeOnlyForAdmin = StringUtil.getBooleanValue(
          getParameterValue(instanceId, InstanceParameters.suppressionOnlyForAdmin));
      return !removeOnlyForAdmin || SilverpeasRole.ADMIN.getName().equals(profile);
    }
    return false;
  }

  public static boolean isCanBeCut(String instanceId, String currentUserId, String profile,
      User ownerDetail) {
    return !KmeliaHelper.isKmax(instanceId) &&
        isUserConsideredAsOwner(instanceId, currentUserId, profile, ownerDetail);
  }

  public static boolean isCreationAllowed(NodePK pk, String profile) {
    boolean publicationsInTopic = !pk.isRoot() || (pk.isRoot() &&
        (isPublicationsOnRootAllowed(pk.getInstanceId()) || !isTreeEnabled(pk.getInstanceId())));
    return !SilverpeasRole.USER.isInRole(profile) && publicationsInTopic;
  }

  public static boolean isPublicationsOnRootAllowed(String instanceId) {
    String parameterValue = getParameterValue(instanceId, InstanceParameters.nbPubliOnRoot);
    if (StringUtil.isDefined(parameterValue)) {
      return Integer.parseInt(parameterValue) == 0;
    }
    return true;
  }

  public static boolean isTreeEnabled(String instanceId) {
    String param = getParameterValue(instanceId, InstanceParameters.treeEnabled);
    if (!StringUtil.isDefined(param)) {
      return true;
    }
    return "0".equals(param) || "1".equals(param);
  }

  private static String getParameterValue(String instanceId, String name) {
    return OrganizationControllerProvider.getOrganisationController()
        .getComponentParameterValue(instanceId, name);
  }

  private static boolean hasWritePrivilege(String currentUserId, String profile, User owner) {
    SilverpeasRole role = SilverpeasRole.fromString(profile);
    return role == SilverpeasRole.ADMIN || role == SilverpeasRole.PUBLISHER ||
        role == SilverpeasRole.SUPERVISOR ||
        (owner != null && currentUserId.equals(owner.getId()) && role == SilverpeasRole.WRITER);
  }
}
