/*
 * Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
 * Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com>
 * Copyright (C) 2007, Dave Watson <dwatson@mimvista.com>
 * Copyright (C) 2008-2010, Google Inc.
 * Copyright (C) 2009, Google, Inc.
 * Copyright (C) 2009, JetBrains s.r.o.
 * Copyright (C) 2007-2008, Robin Rosenberg <robin.rosenberg@dewire.com>
 * Copyright (C) 2006-2008, Shawn O. Pearce <spearce@spearce.org>
 * Copyright (C) 2008, Thad Hughes <thadh@thad.corp.google.com> 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.lib;

import org.eclipse.jgit.util.StringUtils;

/** A line in a Git {@link Config} file. */
class ConfigLine {
	/** The text content before entry. */
	String prefix;

	/** The section name for the entry. */
	String section;

	/** Subsection name. */
	String subsection;

	/** The key name. */
	String name;

	/** The value. */
	String value;

	/** The text content after entry. */
	String suffix;

	/** The source from which this line was included from. */
	String includedFrom;

	ConfigLine forValue(String newValue) {
		final ConfigLine e = new ConfigLine();
		e.prefix = prefix;
		e.section = section;
		e.subsection = subsection;
		e.name = name;
		e.value = newValue;
		e.suffix = suffix;
		e.includedFrom = includedFrom;
		return e;
	}

	boolean match(final String aSection, final String aSubsection,
			final String aKey) {
		return eqIgnoreCase(section, aSection)
				&& eqSameCase(subsection, aSubsection)
				&& eqIgnoreCase(name, aKey);
	}

	boolean match(String aSection, String aSubsection) {
		return eqIgnoreCase(section, aSection)
				&& eqSameCase(subsection, aSubsection);
	}

	private static boolean eqIgnoreCase(String a, String b) {
		if (a == null && b == null)
			return true;
		if (a == null || b == null)
			return false;
		return StringUtils.equalsIgnoreCase(a, b);
	}

	private static boolean eqSameCase(String a, String b) {
		if (a == null && b == null)
			return true;
		if (a == null || b == null)
			return false;
		return a.equals(b);
	}

	@SuppressWarnings("nls")
	@Override
	public String toString() {
		if (section == null)
			return "<empty>";
		StringBuilder b = new StringBuilder(section);
		if (subsection != null)
			b.append(".").append(subsection);
		if (name != null)
			b.append(".").append(name);
		if (value != null)
			b.append("=").append(value);
		return b.toString();
	}
}
