/* This file is part of the KDE Project
   Copyright (c) 2004 Kévin Ottens <ervin ipsquad net>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License version 2 as published by the Free Software Foundation.

   This library 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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.
*/

#include "medium.h"

#include <tdeconfig.h>
#include <tdelocale.h>

const TQString Medium::SEPARATOR = "---";

Medium::Medium(const TQString id, TQString uuid, const TQString name)
{
	m_properties+= id; /* ID */
	m_properties+= uuid; /* UUID */
	m_properties+= name; /* NAME */
	m_properties+= name; /* LABEL */
	m_properties+= TQString::null; /* USER_LABEL */

	m_properties+= "false"; /* MOUNTABLE */
	m_properties+= TQString::null; /* DEVICE_NODE */
	m_properties+= TQString::null; /* MOUNT_POINT */
	m_properties+= TQString::null; /* FS_TYPE */
	m_properties+= "false"; /* MOUNTED */
	m_properties+= TQString::null; /* BASE_URL */
	m_properties+= TQString::null; /* MIME_TYPE */
	m_properties+= TQString::null; /* ICON_NAME */
	m_properties+= "false"; /* ENCRYPTED */
	m_properties+= TQString::null; /* CLEAR_DEVICE_UDI */
	m_properties+= "false"; /* HIDDEN */
	m_properties+= "false"; /* SOFT_HIDDEN */

	loadUserLabel();

	m_halmounted = false;
}

Medium::Medium()
{
	m_properties+= TQString::null; /* ID */
	m_properties+= TQString::null; /* UUID */
	m_properties+= TQString::null; /* NAME */
	m_properties+= TQString::null; /* LABEL */
	m_properties+= TQString::null; /* USER_LABEL */

	m_properties+= TQString::null; /* MOUNTABLE */
	m_properties+= TQString::null; /* DEVICE_NODE */
	m_properties+= TQString::null; /* MOUNT_POINT */
	m_properties+= TQString::null; /* FS_TYPE */
	m_properties+= TQString::null; /* MOUNTED */
	m_properties+= TQString::null; /* BASE_URL */
	m_properties+= TQString::null; /* MIME_TYPE */
	m_properties+= TQString::null; /* ICON_NAME */
	m_properties+= TQString::null; /* ENCRYPTED */
	m_properties+= TQString::null; /* CLEAR_DEVICE_UDI */
	m_properties+= "false";        /* HIDDEN */
	m_properties+= "false";        /* SOFT_HIDDEN */
	
	m_halmounted = false;
}

const Medium Medium::create(const TQStringList &properties)
{
	Medium m;

	if ( properties.size() >= PROPERTIES_COUNT )
	{
		m.m_properties[ID] = properties[ID];
		m.m_properties[UUID] = properties[UUID];
		m.m_properties[NAME] = properties[NAME];
		m.m_properties[LABEL] = properties[LABEL];
		m.m_properties[USER_LABEL] = properties[USER_LABEL];

		m.m_properties[MOUNTABLE] = properties[MOUNTABLE];
		m.m_properties[DEVICE_NODE] = properties[DEVICE_NODE];
		m.m_properties[MOUNT_POINT] = properties[MOUNT_POINT];
		m.m_properties[FS_TYPE] = properties[FS_TYPE];
		m.m_properties[MOUNTED] = properties[MOUNTED];
		m.m_properties[BASE_URL] = properties[BASE_URL];
		m.m_properties[MIME_TYPE] = properties[MIME_TYPE];
		m.m_properties[ICON_NAME] = properties[ICON_NAME];
		m.m_properties[ENCRYPTED] = properties[ENCRYPTED];
		m.m_properties[CLEAR_DEVICE_UDI] = properties[CLEAR_DEVICE_UDI];
		m.m_properties[HIDDEN] = properties[HIDDEN];
		m.m_properties[SOFT_HIDDEN] = properties[SOFT_HIDDEN];
	}

	return m;
}

Medium::MList Medium::createList(const TQStringList &properties)
{
	MList l;

	if ( properties.size() % (PROPERTIES_COUNT+1) == 0)
	{
		int media_count = properties.size()/(PROPERTIES_COUNT+1);

		TQStringList props = properties;

		for(int i=0; i<media_count; i++)
		{
			const Medium m = create(props);
			l.append(m);

			TQStringList::iterator first = props.begin();
			TQStringList::iterator last = props.find(SEPARATOR);
			++last;
			props.erase(first, last);
		}
	}

	return l;
}


void Medium::setName(const TQString &name)
{
	m_properties[NAME] = name;
}

void Medium::setLabel(const TQString &label)
{
	m_properties[LABEL] = label;
}

void Medium::setEncrypted(bool state)
{
	m_properties[ENCRYPTED] = ( state ? "true" : "false" );
}

void Medium::setHidden(bool state)
{
	m_properties[HIDDEN] = ( state ? "true" : "false" );
}

void Medium::setSoftHidden(bool state)
{
	m_properties[SOFT_HIDDEN] = ( state ? "true" : "false" );
}

void Medium::setUserLabel(const TQString &label)
{
	TDEConfig cfg("mediamanagerrc");
	cfg.setGroup("UserLabels");

	TQString entry_name = m_properties[UUID];

	if ( label.isNull() )
	{
		cfg.deleteEntry(entry_name);
	}
	else
	{
		cfg.writeEntry(entry_name, label);
	}

	m_properties[USER_LABEL] = label;
}

void Medium::loadUserLabel()
{
	TDEConfig cfg("mediamanagerrc");
	cfg.setGroup("UserLabels");

	TQString entry_name = m_properties[UUID];

	if ( cfg.hasKey(entry_name) )
	{
		m_properties[USER_LABEL] = cfg.readEntry(entry_name);
	}
	else
	{
		m_properties[USER_LABEL] = TQString::null;
	}
}


bool Medium::mountableState(bool mounted)
{
	if ( m_properties[DEVICE_NODE].isEmpty()
	  || ( mounted && m_properties[MOUNT_POINT].isEmpty() ) )
	{
		return false;
	}

	m_properties[MOUNTABLE] = "true";
	m_properties[MOUNTED] = ( mounted ? "true" : "false" );

	return true;
}

void Medium::mountableState(const TQString &deviceNode,
                            const TQString &mountPoint,
                            const TQString &fsType, bool mounted)
{
	m_properties[MOUNTABLE] = "true";
	m_properties[DEVICE_NODE] = deviceNode;
	m_properties[MOUNT_POINT] = mountPoint;
	m_properties[FS_TYPE] = fsType;
	m_properties[MOUNTED] = ( mounted ? "true" : "false" );
}

void Medium::mountableState(const TQString &deviceNode,
	                    const TQString &clearDeviceUdi,
                            const TQString &mountPoint,
                            const TQString &fsType, bool mounted)
{
	m_properties[MOUNTABLE] = "true";
	m_properties[DEVICE_NODE] = deviceNode;
	m_properties[CLEAR_DEVICE_UDI] = clearDeviceUdi;
	m_properties[MOUNT_POINT] = mountPoint;
	m_properties[FS_TYPE] = fsType;
	m_properties[MOUNTED] = ( mounted ? "true" : "false" );
}

void Medium::unmountableState(const TQString &baseURL)
{
	m_properties[MOUNTABLE] = "false";
	m_properties[BASE_URL] = baseURL;
}

void Medium::setMimeType(const TQString &mimeType)
{
	m_properties[MIME_TYPE] = mimeType;
}

void Medium::setIconName(const TQString &iconName)
{
	m_properties[ICON_NAME] = iconName;
}

bool Medium::needMounting() const
{
	return isMountable() && !isMounted();
}

bool Medium::needDecryption() const
{
	return isEncrypted() && clearDeviceUdi().isEmpty();
}

KURL Medium::prettyBaseURL() const
{
        if ( !baseURL().isEmpty() )
            return baseURL();

		return KURL( mountPoint() );
}

TQString Medium::prettyLabel() const
{
	if ( !userLabel().isEmpty() )
	{
		return userLabel();
	}
	else
	{
		return label();
	}
}