/*! 
*   \file  CMetaData.h
*   \brief Declares class to hold signature of image.
*    
*   \details  
*   CMetaData is a container of image-specific signature. 
*
*   \date     July 2013
*   \copyright eBay Research Labs.
*/

#pragma once

// Include standard C++ headers.
#include <string>   
#include <ctime>
#include <vector>

class CMetaDataQuery;

class CMetaData
{
public:
	static const int CurrentVersion = 1;

	static const std::string	FormatStr,
								SizeStr,
								SizeTypeStr,
								PriceStr,
								PriceMaxStr,
								PriceMinStr,
								BrandStr,
								ConditionStr;

	// Those are bitmasks for search
	enum BuyingFormats { 
			BuyingFormatNone = 0, 
			BuyingFormatAny = 3, 
			BuyingFormatAuction = 1, 
			BuyingFormatBuyItNow = 2 
	} ;

	static const std::string 
			BuyingFormatNoneStr, 
			BuyingFormatAnyStr, 
			BuyingFormatAuctionStr, 
			BuyingFormatBuyItNowStr; 

	enum ItemConditions { 
		ConditionNone = 0, 
		ConditionAny = 15, 
		ConditionNewWithTags=1,
		ConditionNewWithoutTags=2, 
		ConditionNewWithDefects=4,
		ConditionPreOwned=8 
	};

	static const std::string 
		ConditionNoneStr,  
		ConditionAnyStr, 
		ConditionNewWithTagsStr,
		ConditionNewWithoutTagsStr, 
		ConditionNewWithDefectsStr,
		ConditionPreOwnedStr ;
	
public:
	CMetaData();
	CMetaData::CMetaData(const std::string& format, const std::string& condition, const std::string&  brand, const std::string& sizeType, const std::string& size,  const std::string& price);
	
	static const std::string& CMetaData::BuyingFormatAsString(CMetaData::BuyingFormats format);
    static const std::string& CMetaData::ConditionAsString(CMetaData::ItemConditions condition);
    static BuyingFormats  GetFormatFromString(const std::string& format);
    static BuyingFormats  GetFormatFromSaleType(const std::string& format);
	
    static ItemConditions GetConditionFromString(const std::string& condition);

	const std::string& Brand() const { return m_Brand; }
	const std::string& Size() const { return m_Size; }
	const std::string& SizeType() const { return m_SizeType; }
	const std::string& Condition() const;
	const std::string& BuyingFormat() const;
	double Price() const { return m_Price; }

	bool matches(const CMetaDataQuery&) const;

private:
        // Version.
        int m_version;
		std::string m_Brand;
	    std::string m_Size;
	    std::string m_SizeType;
 
        ItemConditions m_Condition;
        BuyingFormats m_BuyingFormat; 
        double m_Price;

		friend class CMetaDataQuery;

};

class CMetaDataQuery
{
public:

public:
	    CMetaDataQuery();
		void addCondition(const std::string&);
		void addFormat(const std::string&);
		void addBrand(const std::string&);
		void addSize(const std::string&);
		void setSizeType(const std::string&);
		void setPriceRange(const std::string&, const std::string&);
public:
        // Version.
        int m_version;

		std::string m_SizeType;
		std::vector<std::string> m_BrandSet;
	    std::vector<std::string> m_SizeSet; // min/max ?

        int m_ConditionSet;
        int m_BuyingFormatSet; 
        float m_PriceMin;
        float m_PriceMax;
};
