// -*- C++ -*-
/**
 * \file vc-backend.h
 * This file is part of LyX, the document processor.
 * Licence details can be found in the file COPYING.
 *
 * \author Lars Gullik Bjønnes
 *
 * Full author contact details are available in file CREDITS.
 */

#ifndef VC_BACKEND_H
#define VC_BACKEND_H

#include <string>

class Buffer;

/// A simple version control system interface
class VCS {
public:
	/// the status of the managed file
	enum VCStatus {
		UNLOCKED,
		LOCKED
	};

	virtual ~VCS() {}

	/// register a file for version control
	virtual void registrer(std::string const & msg) = 0;
	/// check in the current revision
	virtual void checkIn(std::string const & msg) = 0;
	/// check out for editing
	virtual void checkOut() = 0;
	/// revert current edits
	virtual void revert() = 0;
	/// FIXME
	virtual void undoLast() = 0;
	/**
	 * getLog - read the revision log into the given file
	 * @param fname file name to read into
	 */
	virtual void getLog(std::string const &) = 0;
	/// return the current version description
	virtual std::string const versionString() const = 0;
	/// return the current version
	std::string const & version() const {
		return version_;
	}
	/// return the user who has locked the file
	std::string const & locker() const { return locker_; }
	/// set the owning buffer
	void owner(Buffer * b) { owner_ = b; }
	/// return the owning buffer
	Buffer * owner() const { return owner_; }
	/// return the lock status of this file
	VCStatus status() const { return vcstatus; }
protected:
	/// parse information from the version file
	virtual void scanMaster() = 0;

	/**
	 * doVCCommand - call out to the version control utility
	 * @param cmd the command to execute
	 * @param path the path from which to execute
	 * @return exit status
	 */
	static int doVCCommand(std::string const & cmd, std::string const & path);

	/**
	 * The master VC file. For RCS this is *,v or RCS/ *,v. master should
	 * have full path.
	 */
	std::string master_;

	/// The status of the VC controlled file.
	VCStatus vcstatus;

	/**
	 * The version of the VC file. I am not sure if this can be a
	 * string or if it must be a float/int.
	 */
	std::string version_;

	/// The user currently keeping the lock on the VC file.
	std::string locker_;
	/// The buffer using this VC
	Buffer * owner_;
};


///
class RCS : public VCS {
public:

	explicit
	RCS(std::string const & m);

	/// return the revision file for the given file, if found
	static std::string const find_file(std::string const & file);

	static void retrieve(std::string const & file);

	virtual void registrer(std::string const & msg);

	virtual void checkIn(std::string const & msg);

	virtual void checkOut();

	virtual void revert();

	virtual void undoLast();

	virtual void getLog(std::string const &);

	virtual std::string const versionString() const {
		return "RCS: " + version_;
	}

protected:
	virtual void scanMaster();
};


///
class CVS : public VCS {
public:
	///
	explicit
	CVS(std::string const & m, std::string const & f);

	/// return the revision file for the given file, if found
	static std::string const find_file(std::string const & file);

	virtual void registrer(std::string const & msg);

	virtual void checkIn(std::string const & msg);

	virtual void checkOut();

	virtual void revert();

	virtual void undoLast();

	virtual void getLog(std::string const &);

	virtual std::string const versionString() const {
		return "CVS: " + version_;
	}

protected:
	virtual void scanMaster();

private:
	std::string file_;
};
#endif // VCBACKEND_H
