/*
 * Copyright 2021-present Open Networking Foundation
 *
 * Licensed 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.onosproject.kubevirtnetworking.impl;

import com.google.common.collect.ImmutableSet;
import io.fabric8.kubernetes.api.model.Affinity;
import io.fabric8.kubernetes.api.model.Capabilities;
import io.fabric8.kubernetes.api.model.ConfigMapEnvSource;
import io.fabric8.kubernetes.api.model.ConfigMapKeySelector;
import io.fabric8.kubernetes.api.model.ConfigMapProjection;
import io.fabric8.kubernetes.api.model.ConfigMapVolumeSource;
import io.fabric8.kubernetes.api.model.Container;
import io.fabric8.kubernetes.api.model.ContainerPort;
import io.fabric8.kubernetes.api.model.ContainerState;
import io.fabric8.kubernetes.api.model.ContainerStateRunning;
import io.fabric8.kubernetes.api.model.ContainerStateTerminated;
import io.fabric8.kubernetes.api.model.ContainerStateWaiting;
import io.fabric8.kubernetes.api.model.ContainerStatus;
import io.fabric8.kubernetes.api.model.DownwardAPIProjection;
import io.fabric8.kubernetes.api.model.DownwardAPIVolumeFile;
import io.fabric8.kubernetes.api.model.DownwardAPIVolumeSource;
import io.fabric8.kubernetes.api.model.EmptyDirVolumeSource;
import io.fabric8.kubernetes.api.model.EnvFromSource;
import io.fabric8.kubernetes.api.model.EnvVar;
import io.fabric8.kubernetes.api.model.EnvVarSource;
import io.fabric8.kubernetes.api.model.ExecAction;
import io.fabric8.kubernetes.api.model.FieldsV1;
import io.fabric8.kubernetes.api.model.HTTPGetAction;
import io.fabric8.kubernetes.api.model.HTTPHeader;
import io.fabric8.kubernetes.api.model.Handler;
import io.fabric8.kubernetes.api.model.HostPathVolumeSource;
import io.fabric8.kubernetes.api.model.IntOrString;
import io.fabric8.kubernetes.api.model.KeyToPath;
import io.fabric8.kubernetes.api.model.LabelSelector;
import io.fabric8.kubernetes.api.model.LabelSelectorRequirement;
import io.fabric8.kubernetes.api.model.Lifecycle;
import io.fabric8.kubernetes.api.model.LocalObjectReference;
import io.fabric8.kubernetes.api.model.ManagedFieldsEntry;
import io.fabric8.kubernetes.api.model.NodeAffinity;
import io.fabric8.kubernetes.api.model.NodeSelector;
import io.fabric8.kubernetes.api.model.NodeSelectorRequirement;
import io.fabric8.kubernetes.api.model.NodeSelectorTerm;
import io.fabric8.kubernetes.api.model.ObjectFieldSelector;
import io.fabric8.kubernetes.api.model.ObjectMeta;
import io.fabric8.kubernetes.api.model.OwnerReference;
import io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodAffinity;
import io.fabric8.kubernetes.api.model.PodAffinityTerm;
import io.fabric8.kubernetes.api.model.PodAntiAffinity;
import io.fabric8.kubernetes.api.model.PodCondition;
import io.fabric8.kubernetes.api.model.PodIP;
import io.fabric8.kubernetes.api.model.PodReadinessGate;
import io.fabric8.kubernetes.api.model.PodSecurityContext;
import io.fabric8.kubernetes.api.model.PodSpec;
import io.fabric8.kubernetes.api.model.PodStatus;
import io.fabric8.kubernetes.api.model.PreferredSchedulingTerm;
import io.fabric8.kubernetes.api.model.Probe;
import io.fabric8.kubernetes.api.model.ProjectedVolumeSource;
import io.fabric8.kubernetes.api.model.Quantity;
import io.fabric8.kubernetes.api.model.ResourceFieldSelector;
import io.fabric8.kubernetes.api.model.ResourceRequirements;
import io.fabric8.kubernetes.api.model.SELinuxOptions;
import io.fabric8.kubernetes.api.model.SeccompProfile;
import io.fabric8.kubernetes.api.model.SecretEnvSource;
import io.fabric8.kubernetes.api.model.SecretKeySelector;
import io.fabric8.kubernetes.api.model.SecretProjection;
import io.fabric8.kubernetes.api.model.SecretVolumeSource;
import io.fabric8.kubernetes.api.model.SecurityContext;
import io.fabric8.kubernetes.api.model.ServiceAccountTokenProjection;
import io.fabric8.kubernetes.api.model.TCPSocketAction;
import io.fabric8.kubernetes.api.model.Toleration;
import io.fabric8.kubernetes.api.model.Volume;
import io.fabric8.kubernetes.api.model.VolumeDevice;
import io.fabric8.kubernetes.api.model.VolumeMount;
import io.fabric8.kubernetes.api.model.VolumeProjection;
import io.fabric8.kubernetes.api.model.WeightedPodAffinityTerm;
import org.onlab.util.KryoNamespace;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.kubevirtnetworking.api.KubevirtPodEvent;
import org.onosproject.kubevirtnetworking.api.KubevirtPodStore;
import org.onosproject.kubevirtnetworking.api.KubevirtPodStoreDelegate;
import org.onosproject.store.AbstractStore;
import org.onosproject.store.serializers.KryoNamespaces;
import org.onosproject.store.service.ConsistentMap;
import org.onosproject.store.service.MapEvent;
import org.onosproject.store.service.MapEventListener;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;
import org.onosproject.store.service.Versioned;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.slf4j.Logger;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;

import static com.google.common.base.Preconditions.checkArgument;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.onlab.util.Tools.groupedThreads;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_ANNOTATION_ADDED;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_COMPLETED;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_CRASH_LOOP_BACK_OFF;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_CREATED;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_FAILED;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_PENDING;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_REMOVED;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_RUNNING;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_SUCCEEDED;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_UNKNOWN;
import static org.onosproject.kubevirtnetworking.api.KubevirtPodEvent.Type.KUBEVIRT_POD_UPDATED;
import static org.slf4j.LoggerFactory.getLogger;

/**
 * Implementation of kubevirt pod store using consistent map.
 */
@Component(immediate = true, service = KubevirtPodStore.class)
public class DistributedKubevirtPodStore
        extends AbstractStore<KubevirtPodEvent, KubevirtPodStoreDelegate>
        implements KubevirtPodStore {
    private final Logger log = getLogger(getClass());

    private static final String ERR_NOT_FOUND = " does not exist";
    private static final String ERR_DUPLICATE = " already exists";
    private static final String APP_ID = "org.onosproject.k8snetwork";

    private static final String PENDING = "Pending";
    private static final String RUNNING = "Running";
    private static final String SUCCEEDED = "Succeeded";
    private static final String FAILED = "Failed";
    private static final String UNKNOWN = "Unknown";
    private static final String COMPLETED = "Completed";
    private static final String CRASH_LOOP_BACK_OFF = "CrashLoopBackOff";

    private static final KryoNamespace
            SERIALIZER_K8S_POD = KryoNamespace.newBuilder()
            .register(KryoNamespaces.API)
            .register(Pod.class)
            .register(ObjectMeta.class)
            .register(PodSpec.class)
            .register(PodStatus.class)
            .register(PodCondition.class)
            .register(PodIP.class)
            .register(Container.class)
            .register(EnvVar.class)
            .register(EnvVarSource.class)
            .register(EnvFromSource.class)
            .register(ConfigMapEnvSource.class)
            .register(ConfigMapKeySelector.class)
            .register(ObjectFieldSelector.class)
            .register(ResourceFieldSelector.class)
            .register(SecretKeySelector.class)
            .register(Lifecycle.class)
            .register(SecretEnvSource.class)
            .register(ContainerStatus.class)
            .register(ContainerState.class)
            .register(ContainerStateRunning.class)
            .register(ContainerStateTerminated.class)
            .register(ContainerStateWaiting.class)
            .register(OwnerReference.class)
            .register(Probe.class)
            .register(ExecAction.class)
            .register(HTTPGetAction.class)
            .register(HTTPHeader.class)
            .register(TCPSocketAction.class)
            .register(ContainerPort.class)
            .register(ResourceRequirements.class)
            .register(SecurityContext.class)
            .register(PodSecurityContext.class)
            .register(SELinuxOptions.class)
            .register(SeccompProfile.class)
            .register(Handler.class)
            .register(ExecAction.class)
            .register(HTTPGetAction.class)
            .register(TCPSocketAction.class)
            .register(HTTPHeader.class)
            .register(Volume.class)
            .register(VolumeDevice.class)
            .register(VolumeMount.class)
            .register(IntOrString.class)
            .register(Toleration.class)
            .register(PersistentVolumeClaimVolumeSource.class)
            .register(ProjectedVolumeSource.class)
            .register(VolumeProjection.class)
            .register(ConfigMapProjection.class)
            .register(KeyToPath.class)
            .register(DownwardAPIProjection.class)
            .register(DownwardAPIVolumeFile.class)
            .register(ObjectFieldSelector.class)
            .register(ResourceFieldSelector.class)
            .register(SecretProjection.class)
            .register(Quantity.class)
            .register(ServiceAccountTokenProjection.class)
            .register(SecretVolumeSource.class)
            .register(EmptyDirVolumeSource.class)
            .register(Quantity.class)
            .register(Capabilities.class)
            .register(ConfigMapVolumeSource.class)
            .register(KeyToPath.class)
            .register(HostPathVolumeSource.class)
            .register(Affinity.class)
            .register(NodeAffinity.class)
            .register(NodeSelector.class)
            .register(NodeSelectorTerm.class)
            .register(NodeSelectorRequirement.class)
            .register(PreferredSchedulingTerm.class)
            .register(PodAffinity.class)
            .register(WeightedPodAffinityTerm.class)
            .register(PodAffinityTerm.class)
            .register(LabelSelector.class)
            .register(LabelSelectorRequirement.class)
            .register(LocalObjectReference.class)
            .register(PodAntiAffinity.class)
            .register(ManagedFieldsEntry.class)
            .register(DownwardAPIVolumeSource.class)
            .register(DownwardAPIVolumeFile.class)
            .register(ObjectFieldSelector.class)
            .register(FieldsV1.class)
            .register(PodReadinessGate.class)
            .register(LinkedHashMap.class)
            .register(Collection.class)
            .build();

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected CoreService coreService;

    @Reference(cardinality = ReferenceCardinality.MANDATORY)
    protected StorageService storageService;

    private final ExecutorService eventExecutor = newSingleThreadExecutor(
            groupedThreads(this.getClass().getSimpleName(), "event-handler", log));

    private final MapEventListener<String, Pod> podMapListener = new KubevirtPodMapListener();

    private ConsistentMap<String, Pod> podStore;

    @Activate
    protected void activate() {
        ApplicationId appId = coreService.registerApplication(APP_ID);
        podStore = storageService.<String, Pod>consistentMapBuilder()
                .withSerializer(Serializer.using(SERIALIZER_K8S_POD))
                .withName("kubevirt-pod-store")
                .withApplicationId(appId)
                .build();

        podStore.addListener(podMapListener);
        log.info("Started");
    }

    @Deactivate
    protected void deactivate() {
        podStore.removeListener(podMapListener);
        eventExecutor.shutdown();
        log.info("Stopped");
    }

    @Override
    public void createPod(Pod pod) {
        podStore.compute(pod.getMetadata().getUid(), (uid, existing) -> {
            final String error = pod.getMetadata().getUid() + ERR_DUPLICATE;
            checkArgument(existing == null, error);
            return pod;
        });
    }

    @Override
    public void updatePod(Pod pod) {
        podStore.compute(pod.getMetadata().getUid(), (uid, existing) -> {
            final String error = pod.getMetadata().getUid() + ERR_NOT_FOUND;
            checkArgument(existing != null, error);
            return pod;
        });
    }

    @Override
    public Pod removePod(String uid) {
        Versioned<Pod> pod = podStore.remove(uid);
        if (pod == null) {
            final String error = uid + ERR_NOT_FOUND;
            throw new IllegalArgumentException(error);
        }
        return pod.value();
    }

    @Override
    public Pod pod(String uid) {
        return podStore.asJavaMap().get(uid);
    }

    @Override
    public Set<Pod> pods() {
        return ImmutableSet.copyOf(podStore.asJavaMap().values());
    }

    @Override
    public void clear() {
        podStore.clear();
    }

    private class KubevirtPodMapListener implements MapEventListener<String, Pod> {

        @Override
        public void event(MapEvent<String, Pod> event) {

            switch (event.type()) {
                case INSERT:
                    log.debug("Kubernetes pod created {}", event.newValue());
                    eventExecutor.execute(() ->
                            notifyDelegate(new KubevirtPodEvent(
                                    KUBEVIRT_POD_CREATED, event.newValue().value())));
                    break;
                case UPDATE:
                    log.debug("Kubernetes pod updated {}", event.newValue());
                    eventExecutor.execute(() -> processUpdate(event));
                    break;
                case REMOVE:
                    log.debug("Kubernetes pod removed {}", event.oldValue());
                    eventExecutor.execute(() ->
                            notifyDelegate(new KubevirtPodEvent(
                                    KUBEVIRT_POD_REMOVED, event.oldValue().value())));
                    break;
                default:
                    // do nothing
                    break;
            }
        }

        private void processUpdate(MapEvent<String, Pod> event) {
            notifyDelegate(new KubevirtPodEvent(
                    KUBEVIRT_POD_UPDATED, event.newValue().value()));

            String oldPhase = event.oldValue().value().getStatus().getPhase();
            String newPhase = event.newValue().value().getStatus().getPhase();

            if (!PENDING.equals(oldPhase) && PENDING.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_PENDING, event.newValue().value()));
            }

            if (!RUNNING.equals(oldPhase) && RUNNING.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_RUNNING, event.newValue().value()));
            }

            if (!SUCCEEDED.equals(oldPhase) && SUCCEEDED.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_SUCCEEDED, event.newValue().value()));
            }

            if (!FAILED.equals(oldPhase) && FAILED.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_FAILED, event.newValue().value()));
            }

            if (!UNKNOWN.equals(oldPhase) && UNKNOWN.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_UNKNOWN, event.newValue().value()));
            }

            if (!COMPLETED.equals(oldPhase) && COMPLETED.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_COMPLETED, event.newValue().value()));
            }

            if (!CRASH_LOOP_BACK_OFF.equals(oldPhase) && CRASH_LOOP_BACK_OFF.equals(newPhase)) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_CRASH_LOOP_BACK_OFF, event.newValue().value()));
            }

            Map<String, String> oldAnnot = event.oldValue().value().getMetadata().getAnnotations();
            Map<String, String> newAnnot = event.newValue().value().getMetadata().getAnnotations();

            if (oldAnnot == null && newAnnot != null) {
                notifyDelegate(new KubevirtPodEvent(
                        KUBEVIRT_POD_ANNOTATION_ADDED, event.newValue().value()));
            }
        }
    }
}
