/***************************************************************************
 *   Copyright (C) 2005, 2006      by Pino Toscano, toscano.pino@tiscali.it      *
 *                                                                         *
 *   This program 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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
 ***************************************************************************/

#include "kalziumnumerationtype.h"

#include "kalziumdataobject.h"
#include "kalziumtabletype.h"

#include <klocale.h>

KalziumNumerationTypeFactory::KalziumNumerationTypeFactory()
{
	m_numerations << KalziumNoneNumerationType::instance();
	m_numerations << KalziumIUPACNumerationType::instance();
	m_numerations << KalziumCASNumerationType::instance();
	m_numerations << KalziumOldIUPACNumerationType::instance();
}

KalziumNumerationTypeFactory* KalziumNumerationTypeFactory::instance()
{
	static KalziumNumerationTypeFactory kntf;
	return &kntf;
}

KalziumNumerationType* KalziumNumerationTypeFactory::build( int id ) const
{
	if ( ( id < 0 ) || ( id >= m_numerations.count() ) )
		return 0;

	return m_numerations.at( id );
}

KalziumNumerationType* KalziumNumerationTypeFactory::build( const QByteArray& id ) const
{
	for ( int i = 0; i < m_numerations.count(); i++ )
	{
		if ( m_numerations.at( i )->name() == id )
			return m_numerations.at( i );
	}
	
	// not found
	return 0;
}

QStringList KalziumNumerationTypeFactory::numerations() const
{
	QStringList l;
	for ( int i = 0; i < m_numerations.count(); i++ )
	{
		l << m_numerations.at( i )->description();
	}
	return l;
}


KalziumNumerationType* KalziumNumerationType::instance()
{
	return 0;
}

KalziumNumerationType::KalziumNumerationType()
{
}

KalziumNumerationType::~KalziumNumerationType()
{
}

QString KalziumNumerationType::item( const int num ) const
{
	if ( ( num < 0 ) || ( num >= m_items.count() ) )
		return QString();
	
	return m_items.at( num );
}

QStringList KalziumNumerationType::items() const
{
	return m_items;
}


KalziumNoneNumerationType* KalziumNoneNumerationType::instance()
{
	static KalziumNoneNumerationType knnt;
	return &knnt;
}

KalziumNoneNumerationType::KalziumNoneNumerationType()
  : KalziumNumerationType()
{
}

QByteArray KalziumNoneNumerationType::name() const
{
	return "None";
}

QString KalziumNoneNumerationType::description() const
{
	return i18n( "No Numeration" );
}

QString KalziumNoneNumerationType::item( const int num ) const
{
	Q_UNUSED( num );
	return QString();
}

QStringList KalziumNoneNumerationType::items() const
{
	return QStringList();
}

KalziumIUPACNumerationType* KalziumIUPACNumerationType::instance()
{
	static KalziumIUPACNumerationType kint;
	return &kint;
}

KalziumIUPACNumerationType::KalziumIUPACNumerationType()
  : KalziumNumerationType()
{
	// cache them
	m_items << QString( "1" );
	m_items << QString( "2" );
	m_items << QString( "3" );
	m_items << QString( "4" );
	m_items << QString( "5" );
	m_items << QString( "6" );
	m_items << QString( "7" );
	m_items << QString( "8" );
	m_items << QString( "9" );
	m_items << QString( "10" );
	m_items << QString( "11" );
	m_items << QString( "12" );
	m_items << QString( "13" );
	m_items << QString( "14" );
	m_items << QString( "15" );
	m_items << QString( "16" );
	m_items << QString( "17" );
	m_items << QString( "18" );
}

QByteArray KalziumIUPACNumerationType::name() const
{
	return "IUPAC";
}

QString KalziumIUPACNumerationType::description() const
{
	return i18n( "IUPAC" );
}

KalziumCASNumerationType* KalziumCASNumerationType::instance()
{
	static KalziumCASNumerationType kcnt;
	return &kcnt;
}

KalziumCASNumerationType::KalziumCASNumerationType()
  : KalziumNumerationType()
{
	// cache them
	m_items << QString( "IA" );
	m_items << QString( "IIA" );
	m_items << QString( "IIIB" );
	m_items << QString( "IVB" );
	m_items << QString( "VB" );
	m_items << QString( "VIB" );
	m_items << QString( "VIIB" );
	m_items << QString( "VIII" );
	m_items << QString( "VIII" );
	m_items << QString( "VIII" );
	m_items << QString( "IB" );
	m_items << QString( "IIB" );
	m_items << QString( "IIIA" );
	m_items << QString( "IVA" );
	m_items << QString( "VA" );
	m_items << QString( "VIA" );
	m_items << QString( "VIIA" );
	m_items << QString( "VIIIA" );
}

QByteArray KalziumCASNumerationType::name() const
{
	return "CAS";
}

QString KalziumCASNumerationType::description() const
{
	return i18n( "CAS" );
}

KalziumOldIUPACNumerationType* KalziumOldIUPACNumerationType::instance()
{
	static KalziumOldIUPACNumerationType koint;
	return &koint;
}

KalziumOldIUPACNumerationType::KalziumOldIUPACNumerationType()
  : KalziumNumerationType()
{
	// cache them
	m_items << QString( "1A" );
	m_items << QString( "2A" );
	m_items << QString( "3A" );
	m_items << QString( "4A" );
	m_items << QString( "5A" );
	m_items << QString( "6A" );
	m_items << QString( "7A" );
	m_items << QString( "8" );
	m_items << QString( "8" );
	m_items << QString( "8" );
	m_items << QString( "1B" );
	m_items << QString( "2B" );
	m_items << QString( "3B" );
	m_items << QString( "4B" );
	m_items << QString( "5B" );
	m_items << QString( "6B" );
	m_items << QString( "7B" );
	m_items << QString( "0" );
}

QByteArray KalziumOldIUPACNumerationType::name() const
{
	return "OldIUPAC";
}

QString KalziumOldIUPACNumerationType::description() const
{
	return i18n( "Old IUPAC" );
}
