/*-
 * ~~~~~~licensing~~~~~~
 * connection-producing
 * ==========
 * Copyright (C) 2020 - 2022 EmDev LLC
 * ==========
 * 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.
 * ~~~~~~/licensing~~~~~~
 */
package ru.entaxy.platform.base.objects.connection.producing.adapters;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.osgi.framework.Bundle;
import org.osgi.framework.BundleEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ru.entaxy.base.generator.template.impl.ProvidedTemplate;
import ru.entaxy.base.generator.template.impl.TemplateMetadata;
import ru.entaxy.base.generator.template.impl.TemplateProvider;
import ru.entaxy.platform.base.support.osgi.tracker.UniformBundleTrackerCustomizer;

public class TrackedAdapterCustomizer extends UniformBundleTrackerCustomizer<List<TrackedAdapter>> {

	private static final Logger log = LoggerFactory.getLogger(TrackedAdapterCustomizer.class);
	
	@Override
	protected List<TrackedAdapter> createManagedObject(Bundle bundle, BundleEvent event,
			Map<String, List<?>> filterResults) {

		URL metadataUrl = bundle.getEntry("/ru/entaxy/adapter/metadata.json");
		log.debug("Json URL is {}", metadataUrl.toString());
		
		try {
		
			String metadata = new BufferedReader (
			  new InputStreamReader(
					  metadataUrl.openStream(), StandardCharsets.UTF_8))
				.lines()
				.collect(Collectors.joining("\n"));
	
			TrackedAdapter trackedAdapter = new TrackedAdapter();
			trackedAdapter.setMetadata(metadata);
			trackedAdapter.setBundleId(bundle.getBundleId());
			
			String configuration = ConfigConverter.convertFromAdapter(metadata);
			trackedAdapter.setConfiguration(configuration);

			log.info("TrackedAdapter metadata: \n" + metadata);
			log.info("TrackedAdapter configuration: \n" + configuration);

			Enumeration<URL> foundEntries = bundle.findEntries("/template/", "*.*", true);
			while (foundEntries.hasMoreElements()) {
				URL entry = foundEntries.nextElement();
				log.debug("FOUND :: " + entry.toString());
				if (entry.toString().endsWith("/")) {
					log.debug(":: .. is folder");
					continue;
				}
				trackedAdapter.getTemplates().add(entry);
			}
			
			return Collections.<TrackedAdapter>singletonList(trackedAdapter);
			
			
		} catch (Exception e) {
			log.error("Failed to read adapter metadata from bundle [" + bundle.getBundleId() + "]", e);
		}
		
		return null;
	}



}
