/*  Variable.cpp
 *
 *  Copyright (C) 2013-2016  Jim Evins <evins@snaught.com>
 *
 *  This file is part of gLabels-qt.
 *
 *  gLabels-qt is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  gLabels-qt is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with gLabels-qt.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "Variable.h"


namespace glabels
{
	namespace model
	{

		Variable::Variable( Variable::Type      type,
		                    const QString&      name,
		                    const QString&      initialValue,
		                    Variable::Increment increment,
		                    const QString&      stepSize )
			: mType(type),
			  mName(name),
			  mInitialValue(initialValue),
			  mIncrement(increment),
			  mStepSize(stepSize)
		{
			// empty
		}


		Variable::Type Variable::type() const
		{
			return mType;
		}

	
		QString Variable::name() const
		{
			return mName;
		}


		QString Variable::initialValue() const
		{
			return mInitialValue;
		}


		Variable::Increment Variable::increment() const
		{
			return mIncrement;
		}


		QString Variable::stepSize() const
		{
			return mStepSize;
		}

		
		void    Variable::resetValue()
		{
			switch (mType)
			{
			case Type::STRING:
				// do nothing
				break;
			case Type::INTEGER:
				mIntegerValue = mInitialValue.toLongLong();
				mIntegerStep  = mStepSize.toLongLong();
				break;
			case Type::FLOATING_POINT:
				mFloatingPointValue = mInitialValue.toDouble();
				mFloatingPointStep  = mStepSize.toDouble();
				break;
			case Type::COLOR:
				// do nothing
				break;
			}
		}

		
		void    Variable::incrementValueOnItem()
		{
			if ( mIncrement == Increment::PER_ITEM )
			{
				switch (mType)
				{
				case Type::STRING:
					// do nothing
					break;
				case Type::INTEGER:
					mIntegerValue += mIntegerStep;
					break;
				case Type::FLOATING_POINT:
					mFloatingPointValue += mFloatingPointStep;
					break;
				case Type::COLOR:
					// do nothing
					break;
				}
			}
		}

		
		void    Variable::incrementValueOnCopy()
		{
			if ( mIncrement == Increment::PER_COPY )
			{
				switch (mType)
				{
				case Type::STRING:
					// do nothing
					break;
				case Type::INTEGER:
					mIntegerValue += mIntegerStep;
					break;
				case Type::FLOATING_POINT:
					mFloatingPointValue += mFloatingPointStep;
					break;
				case Type::COLOR:
					// do nothing
					break;
				}
			}
		}

		
		void    Variable::incrementValueOnPage()
		{
			if ( mIncrement == Increment::PER_PAGE )
			{
				switch (mType)
				{
				case Type::STRING:
					// do nothing
					break;
				case Type::INTEGER:
					mIntegerValue += mIntegerStep;
					break;
				case Type::FLOATING_POINT:
					mFloatingPointValue += mFloatingPointStep;
					break;
				case Type::COLOR:
					// do nothing
					break;
				}
			}
		}

		
		QString Variable::value() const
		{
			switch (mType)
			{
			case Type::STRING:
				return mInitialValue;
			case Type::INTEGER:
				return QString::number( mIntegerValue );
			case Type::FLOATING_POINT:
				return QString::number( mFloatingPointValue, 'g', 15 );
			case Type::COLOR:
				return mInitialValue;
			default:
				return mInitialValue;
			}
		}

		
		QString Variable::typeToI18nString( Type type )
		{
			switch (type)
			{
			case Type::STRING:
				return tr("String");
			case Type::INTEGER:
				return tr("Integer");
			case Type::FLOATING_POINT:
				return tr("Floating Point");
			case Type::COLOR:
				return tr("Color");
			default:
				return tr("String");
			}
		}


		QString Variable::typeToIdString( Type type )
		{
			switch (type)
			{
			case Type::STRING:
				return "string";
			case Type::INTEGER:
				return "integer";
			case Type::FLOATING_POINT:
				return "float";
			case Type::COLOR:
				return "color";
			default:
				return "string";
			}
		}
		

		Variable::Type Variable::idStringToType( const QString& id )
		{
			if ( id == "string" )
			{
				return Type::STRING;
			}
			else if ( id == "integer" )
			{
				return Type::INTEGER;
			}
			else if ( id == "float" )
			{
				return Type::FLOATING_POINT;
			}
			if ( id == "color" )
			{
				return Type::COLOR;
			}
			else
			{
				return Type::STRING; // Default
			}
		}
		

		QString Variable::incrementToI18nString( Increment increment )
		{
			switch (increment)
			{
			case Increment::NEVER:
				return tr("Never");
			case Increment::PER_ITEM:
				return tr("Per item");
			case Increment::PER_COPY:
				return tr("Per copy");
			case Increment::PER_PAGE:
				return tr("Per page");
			default:
				return tr("Never");
			}
		}

		
		QString Variable::incrementToIdString( Increment increment )
		{
			switch (increment)
			{
			case Increment::NEVER:
				return "never";
			case Increment::PER_ITEM:
				return "per_item";
			case Increment::PER_COPY:
				return "per_copy";
			case Increment::PER_PAGE:
				return "per_page";
			default:
				return "never";
			}
		}
		

		Variable::Increment Variable::idStringToIncrement( const QString& id )
		{
			if ( id == "never" )
			{
				return Increment::NEVER;
			}
			else if ( id == "per_item" )
			{
				return Increment::PER_ITEM;
			}
			else if ( id == "per_copy" )
			{
				return Increment::PER_COPY;
			}
			else if ( id == "per_page" )
			{
				return Increment::PER_PAGE;
			}
			else
			{
				return Increment::NEVER; // Default
			}
		}
		

	}
}
