/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hadoop.yarn.service;

import org.apache.hadoop.yarn.service.api.records.Component;
import org.apache.hadoop.yarn.service.api.records.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Finds all the the target component specs.
 */
public interface UpgradeComponentsFinder {

  List<Component> findTargetComponentSpecs(Service currentDef,
      Service targetDef);

  /**
   * Default implementation of {@link UpgradeComponentsFinder} that finds all
   * the target component specs.
   */
  class DefaultUpgradeComponentsFinder implements UpgradeComponentsFinder {

    @Override
    public List<Component> findTargetComponentSpecs(Service currentDef,
        Service targetDef) {
      if (currentDef.getComponents().size() !=
          targetDef.getComponents().size()) {
        throw new UnsupportedOperationException(
            "addition/deletion of components not supported by upgrade");
      }
      if (!currentDef.getKerberosPrincipal().equals(
          targetDef.getKerberosPrincipal())) {
        throw new UnsupportedOperationException("changes to kerberos " +
            "principal not supported by upgrade");
      }
      if (!Objects.equals(currentDef.getQueue(), targetDef.getQueue())) {
        throw new UnsupportedOperationException("changes to queue " +
            "not supported by upgrade");
      }

      if (!Objects.equals(currentDef.getResource(), targetDef.getResource())) {
        throw new UnsupportedOperationException("changes to resource " +
            "not supported by upgrade");
      }

      if (!Objects.equals(currentDef.getDescription(),
          targetDef.getDescription())) {
        throw new UnsupportedOperationException("changes to description " +
            "not supported by upgrade");
      }

      if (!Objects.equals(currentDef.getQuicklinks(),
          targetDef.getQuicklinks())) {
        throw new UnsupportedOperationException("changes to quick links " +
            "not supported by upgrade");
      }

      if (!Objects.equals(currentDef.getLaunchTime(),
          targetDef.getLaunchTime())) {
        throw new UnsupportedOperationException("changes to launch time " +
            "not supported by upgrade");
      }


      if (!Objects.equals(currentDef.getLifetime(),
          targetDef.getLifetime())) {
        throw new UnsupportedOperationException("changes to lifetime " +
            "not supported by upgrade");
      }

      if (!Objects.equals(currentDef.getConfiguration(),
          currentDef.getConfiguration())) {
        return targetDef.getComponents();
      }

      if (!Objects.equals(currentDef.getArtifact(), targetDef.getArtifact())) {
        return targetDef.getComponents();
      }

      List<Component> targetComps = new ArrayList<>();
      targetDef.getComponents().forEach(component -> {
        Component currentComp = currentDef.getComponent(component.getName());

        if (!Objects.equals(currentComp.getName(), component.getName())) {
          throw new UnsupportedOperationException(
              "changes to component name not supported by upgrade");
        }

        if (!Objects.equals(currentComp.getDependencies(),
            component.getDependencies())) {
          throw new UnsupportedOperationException(
              "changes to component dependencies not supported by upgrade");
        }

        if (!Objects.equals(currentComp.getReadinessCheck(),
            component.getReadinessCheck())) {
          throw new UnsupportedOperationException(
              "changes to component readiness check not supported by upgrade");
        }

        if (!Objects.equals(currentComp.getResource(),
            component.getResource())) {
          throw new UnsupportedOperationException(
              "changes to component resource not supported by upgrade");
        }


        if (!Objects.equals(currentComp.getRunPrivilegedContainer(),
            component.getRunPrivilegedContainer())) {
          throw new UnsupportedOperationException(
              "changes to run privileged container not supported by upgrade");
        }

        if (!Objects.equals(currentComp.getPlacementPolicy(),
            component.getPlacementPolicy())) {
          throw new UnsupportedOperationException(
              "changes to component placement policy not supported by upgrade");
        }

        if (!Objects.equals(currentComp.getQuicklinks(),
            component.getQuicklinks())) {
          throw new UnsupportedOperationException(
              "changes to component quick links not supported by upgrade");
        }

        if (!Objects.equals(currentComp.getArtifact(),
            component.getArtifact()) ||
            !Objects.equals(currentComp.getLaunchCommand(),
                component.getLaunchCommand()) ||
            !Objects.equals(currentComp.getConfiguration(),
                component.getConfiguration())) {
          targetComps.add(component);
        }
      });
      return targetComps;
    }
  }
}
