#pragma once
#ifndef REAL_BUILD
# include "externals.hh"
#endif

#include <ebcl/Sets.hh>

struct T_Project;

class A_ProjectPathListener
{
	friend struct T_Project;
    public:
	virtual ~A_ProjectPathListener( ) = 0;
    protected:
	virtual void projectPathChanged( ) noexcept = 0;
};

struct T_Project
{
	explicit T_Project( T_FSPath const& path ) noexcept
		{ setBasePath( path ); }

	void setBasePath( T_FSPath const& path ) noexcept;

	T_FSPath const& basePath( ) const noexcept
		{ return basePath_; }

	T_String pathOf( T_String const& file ) const noexcept;
	T_String pathOf( char const* file ) const noexcept;

	void addListener( A_ProjectPathListener* listener ) noexcept
		{ listeners_.add( listener ); }
	void removeListener( A_ProjectPathListener* listener ) noexcept
		{ listeners_.remove( listener ); }

    private:
	T_FSPath basePath_;
	ebcl::T_Set< A_ProjectPathListener* > listeners_{
		ebcl::UseTag< ebcl::ArrayBacked< 16 > >( )
	};
};