/*
 * 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.camel.k.quarkus;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;

import io.quarkus.arc.Arc;
import io.quarkus.arc.ArcContainer;
import io.quarkus.arc.InstanceHandle;
import io.quarkus.runtime.Quarkus;
import org.apache.camel.CamelContext;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.main.BaseMainSupport;
import org.apache.camel.main.MainListener;
import org.apache.camel.main.RoutesCollector;

public final class Application {
    private Application() {
    }

    /**
     * The camel-k runtime impl based on camel-quarkus
     */
    public static class Runtime implements org.apache.camel.k.Runtime {
        private final BaseMainSupport main;
        private final AtomicBoolean stopped;

        public Runtime(BaseMainSupport main) {
            this.main = main;
            this.main.configure().setAutoConfigurationLogSummary(false);
            this.stopped = new AtomicBoolean();
        }

        @Override
        public CamelContext getCamelContext() {
            return main.getCamelContext();
        }

        @Override
        public void addRoutes(RoutesBuilder builder) {
            main.configure().addRoutesBuilder(builder);
        }

        @Override
        public void setProperties(Properties properties) {
            main.setOverrideProperties(properties);
        }

        @Override
        public void stop() throws Exception {
            if (!this.stopped.compareAndExchange(false, true)) {
                Quarkus.asyncExit();
            }
        }
    }

    /**
     * Adapts main events to camel-k runtime lifecycle
     */
    public static class ListenerAdapter implements MainListener {
        private final org.apache.camel.k.Runtime.Listener[] listeners;

        public ListenerAdapter(List<org.apache.camel.k.Runtime.Listener> listeners) {
            this.listeners = listeners.stream()
                .sorted(Comparator.comparingInt(org.apache.camel.k.Runtime.Listener::getOrder))
                .toArray(org.apache.camel.k.Runtime.Listener[]::new);
        }

        @Override
        public void beforeInitialize(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.Initializing);
            invokeListeners(org.apache.camel.k.Runtime.Phase.ConfigureProperties);
        }

        @Override
        public void beforeConfigure(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.ConfigureRoutes);
        }

        @Override
        public void afterConfigure(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.ConfigureContext);
        }

        @Override
        public void configure(CamelContext context) {
            // no-op
        }

        @Override
        public void beforeStart(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.Starting);
        }

        @Override
        public void afterStart(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.Started);
        }

        @Override
        public void beforeStop(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.Stopping);
        }

        @Override
        public void afterStop(BaseMainSupport main) {
            invokeListeners(org.apache.camel.k.Runtime.Phase.Stopped);
        }

        private void invokeListeners(org.apache.camel.k.Runtime.Phase phase) {
            org.apache.camel.k.Runtime runtime = instance(org.apache.camel.k.Runtime.class)
                .orElseThrow(() -> new IllegalStateException("Unable to fine a Runtime instance"));

            for (int i = 0; i < listeners.length; i ++) {
                listeners[i].accept(phase, runtime);
            }
        }
    }

    /**
     * Since routes are programmatically loaded, create a no-hop collector
     */
    public static class NoRoutesCollector implements RoutesCollector {
        @Override
        public Collection<RoutesBuilder> collectRoutesFromDirectory(CamelContext camelContext, String excludePattern, String includePattern) {
            return Collections.emptyList();
        }

        @Override
        public List<RoutesBuilder> collectRoutesFromRegistry(CamelContext camelContext, String excludePattern, String includePattern) {
            return Collections.emptyList();
        }
    }

    // *********************************
    //
    // Helpers
    //
    // *********************************

    public static Optional<ArcContainer> container() {
        return Optional.of(Arc.container());
    }

    public static <T> Optional<T> instance(Class<T> type) {
        return container()
            .map(container -> container.instance(type))
            .map(InstanceHandle::get);
    }
}
