package aQute.bnd.filerepo;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import aQute.bnd.version.Version;
import aQute.bnd.version.VersionRange;
import aQute.lib.io.IO;

@Deprecated
public class FileRepo {
	File	root;
	Pattern	REPO_FILE	= Pattern.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+)\\.(jar|lib)");

	public FileRepo(File root) {
		this.root = root;
	}

	/**
	 * Get a list of URLs to bundles that are constrained by the bsn and
	 * versionRange.
	 */
	public File[] get(String bsn, final VersionRange versionRange) throws Exception {

		//
		// Check if the entry exists
		//
		File f = new File(root, bsn);
		if (!f.isDirectory())
			return null;

		//
		// Iterator over all the versions for this BSN.
		// Create a sorted map over the version as key
		// and the file as URL as value. Only versions
		// that match the desired range are included in
		// this list.
		//
		return f.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {
				Matcher m = REPO_FILE.matcher(name);
				if (!m.matches())
					return false;
				if (versionRange == null)
					return true;

				Version v = new Version(m.group(2));
				return versionRange.includes(v);
			}
		});
	}

	public List<String> list(String regex) throws Exception {
		if (regex == null)
			regex = ".*";
		final Pattern pattern = Pattern.compile(regex);

		String list[] = root.list(new FilenameFilter() {

			public boolean accept(File dir, String name) {
				Matcher matcher = pattern.matcher(name);
				return matcher.matches();
			}

		});
		return Arrays.asList(list);
	}

	public List<Version> versions(String bsn) throws Exception {
		File dir = new File(root, bsn);
		final List<Version> versions = new ArrayList<Version>();
		dir.list(new FilenameFilter() {

			public boolean accept(File dir, String name) {
				Matcher m = REPO_FILE.matcher(name);
				if (m.matches()) {
					versions.add(new Version(m.group(2)));
					return true;
				}
				return false;
			}

		});
		return versions;
	}

	public File get(String bsn, VersionRange range, int strategy) throws Exception {
		File[] files = get(bsn, range);
		if (files == null || files.length == 0)
			return null;

		if (files.length == 1)
			return files[0];

		if (strategy < 0) {
			return files[0];
		}
		return files[files.length - 1];
	}

	public File put(String bsn, Version version) throws IOException {
		File dir = new File(root, bsn);
		IO.mkdirs(dir);
		File file = new File(dir,
				bsn + "-" + version.getMajor() + "." + version.getMinor() + "." + version.getMicro() + ".jar");
		return file;
	}

}
