/*
 * Copyright (C) 2015, David Ostrovsky <david@ostrovsky.org> and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.archive;

import java.beans.Statement;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Map;

import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.eclipse.jgit.archive.internal.ArchiveText;
import org.eclipse.jgit.util.StringUtils;

/**
 * Base format class
 *
 * @since 4.0
 */
public class BaseFormat {
	/**
	 * Compression-level for the archive file. Only values in [0-9] are allowed.
	 * @since 5.11
	 */
	protected static final String COMPRESSION_LEVEL = "compression-level"; //$NON-NLS-1$

	/**
	 * Apply options to archive output stream
	 *
	 * @param s
	 *            stream to apply options to
	 * @param o
	 *            options map
	 * @return stream with option applied
	 * @throws IOException
	 *             if an IO error occurred
	 */
	protected ArchiveOutputStream<? extends ArchiveEntry> applyFormatOptions(
			ArchiveOutputStream<? extends ArchiveEntry> s,
			Map<String, Object> o) throws IOException {
		for (Map.Entry<String, Object> p : o.entrySet()) {
			try {
				if (p.getKey().equals(COMPRESSION_LEVEL)) {
					continue;
				}
				new Statement(s, "set" + StringUtils.capitalize(p.getKey()), //$NON-NLS-1$
						new Object[] { p.getValue() }).execute();
			} catch (Exception e) {
				throw new IOException(MessageFormat.format(
						ArchiveText.get().cannotSetOption, p.getKey()), e);
			}
		}
		return s;
	}

	/**
	 * Removes and returns the {@link #COMPRESSION_LEVEL} key from the input map
	 * parameter if it exists, or -1 if this key does not exist.
	 *
	 * @param o
	 *            options map
	 * @return The compression level if it exists in the map, or -1 instead.
	 * @throws IllegalArgumentException
	 *             if the {@link #COMPRESSION_LEVEL} option does not parse to an
	 *             Integer.
	 * @since 5.11
	 */
	protected int getCompressionLevel(Map<String, Object> o) {
		if (!o.containsKey(COMPRESSION_LEVEL)) {
			return -1;
		}
		Object option = o.get(COMPRESSION_LEVEL);
		try {
			Integer compressionLevel = (Integer) option;
			return compressionLevel.intValue();
		} catch (ClassCastException e) {
			throw new IllegalArgumentException(
					MessageFormat.format(
							ArchiveText.get().invalidCompressionLevel, option),
					e);
		}
	}
}
