/*
 * 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 3 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, see <http://www.gnu.org/licenses/>.
 */

#include "UBPlatformUtils.h"

#include <QtGui>

#include <X11/Xlib.h>
#include <X11/keysym.h>


void UBPlatformUtils::init()
{
	initializeKeyboardLayouts();
}

QString UBPlatformUtils::applicationResourcesDirectory()
{
    return QApplication::applicationDirPath();
}

void UBPlatformUtils::hideFile(const QString &filePath)
{
    Q_UNUSED(filePath)
    // TODO UB 4.x Not possible on Linux as such, the filename should have a . as first char in name
}

void UBPlatformUtils::setFileType(const QString &filePath, unsigned long fileType)
{
    Q_UNUSED(filePath)
    Q_UNUSED(fileType)

    // No fileType equivalent on Linux
}

void UBPlatformUtils::fadeDisplayOut()
{
    // NOOP
}

void UBPlatformUtils::fadeDisplayIn()
{
    // NOOP
}

QString UBPlatformUtils::preferredTranslation(QString pFilePrefix)
{
    QString qmPath = applicationResourcesDirectory() + "/" + "i18n" + "/" + pFilePrefix + preferredLanguage() + ".qm";
    return qmPath;
}

QString UBPlatformUtils::preferredLanguage()
{
    return QLocale::system().name();
}

void UBPlatformUtils::runInstaller(const QString &installerFilePath)
{
    // TODO UB 4.x - auto update & installer are deactivated on Linux
    Q_UNUSED(installerFilePath);

}

void UBPlatformUtils::bringPreviousProcessToFront()
{
    // Mac only
}

QString UBPlatformUtils::osUserLoginName()
{
    char *user = getenv("USER");
    return QString::fromAscii(user);
}

QString UBPlatformUtils::computerName()
{
    // TODO Linux implement me
    return "Not Implemented";
}

void UBPlatformUtils::setWindowNonActivableFlag(QWidget* widget, bool nonAcivable)
{
    Q_UNUSED(widget);
    Q_UNUSED(nonAcivable);
}



void UBPlatformUtils::setDesktopMode(bool desktop)
{
    // NOOP
    Q_UNUSED(desktop);
}

const KEYBT ENGLISH_LOCALE[] = {
        /* ` ~ */ KEYBT(0x60, 0x7e),
        /* 1 ! */ KEYBT(0x31, 0x21),
        /* 2 @ */ KEYBT(0x32, 0x40),
        /* 3 # */ KEYBT(0x33, 0x23),
        /* 4 $ */ KEYBT(0x34, 0x24),
        /* 5 % */ KEYBT(0x35, 0x25),
        /* 6 ^ */ KEYBT(0x36, 0x88),
        /* 7 & */ KEYBT(0x37, 0x26),
        /* 8 * */ KEYBT(0x38, 0x2a),
        /* 9 ( */ KEYBT(0x39, 0x28),
        /* 0 ) */ KEYBT(0x30, 0x29),
        /* - _ */ KEYBT(0x2d, 0x5f),
        /* = + */ KEYBT(0x3d, 0x2b),

        /* q Q */ KEYBT(0x71, 0x51),
        /* w W */ KEYBT(0x77, 0x57),
        /* e E */ KEYBT(0x65, 0x45),
        /* r R */ KEYBT(0x72, 0x52),
        /* t T */ KEYBT(0x74, 0x54),
        /* y Y */ KEYBT(0x79, 0x59),
        /* u U */ KEYBT(0x75, 0x55),
        /* i I */ KEYBT(0x69, 0x49),
        /* o O */ KEYBT(0x6f, 0x4f),
        /* p P */ KEYBT(0x70, 0x50),
        /* [ { */ KEYBT(0x5b, 0x7b),
        /* ] } */ KEYBT(0x5d, 0x7d),

        /* a A */ KEYBT(0x61, 0x41),
        /* s S */ KEYBT(0x73, 0x53),
        /* d D */ KEYBT(0x64, 0x44),
        /* f F */ KEYBT(0x66, 0x46),
        /* g G */ KEYBT(0x67, 0x47),
        /* h H */ KEYBT(0x68, 0x48),
        /* j J */ KEYBT(0x6a, 0x4a),
        /* k K */ KEYBT(0x6b, 0x4b),
        /* l L */ KEYBT(0x6c, 0x4c),
        /* ; : */ KEYBT(0x3b, 0x3a),
        /* ' " */ KEYBT(0x27, 0x22),
        /* \ | */ KEYBT(0x5c, 0x7c),

        /* z Z */ KEYBT(0x7a, 0x5a),
        /* x X */ KEYBT(0x78, 0x58),
        /* c C */ KEYBT(0x63, 0x43),
        /* v V */ KEYBT(0x76, 0x56),
        /* b B */ KEYBT(0x62, 0x42),
        /* n N */ KEYBT(0x6e, 0x4e),
        /* m M */ KEYBT(0x6d, 0x4d),
        /* , < */ KEYBT(0x2c, 0x3c),
        /* . > */ KEYBT(0x2e, 0x3e),
        /* / ? */ KEYBT(0x2f, 0x5f)};

const KEYBT RUSSIAN_LOCALE [] =
{
        /* ё Ё */ KEYBT(0x451, XK_Cyrillic_io, 0x401, XK_Cyrillic_IO),
        /* 1 ! */ KEYBT(0x31, 0x21),
        /* 2 " */ KEYBT(0x32, 0x5c),
        /* 3 № */ KEYBT(0x33, 0x33, 0x2116, XK_numerosign),
        /* 4 ; */ KEYBT(0x34, 0x3b),
        /* 5 % */ KEYBT(0x35, 0x25),
        /* 6 : */ KEYBT(0x36, 0x3a),
        /* 7 ? */ KEYBT(0x37, 0x3f),
        /* 8 * */ KEYBT(0x38, 0x2a),
        /* 9 ( */ KEYBT(0x39, 0x28),
        /* 0 ) */ KEYBT(0x30, 0x29),
        /* - _ */ KEYBT(0x2d, 0x4f),
        /* = + */ KEYBT(0x3d, 0x2b),

        /* й Й */ KEYBT(0x439, XK_Cyrillic_shorti, 0x419, XK_Cyrillic_SHORTI),
        /* ц Ц */ KEYBT(0x446, XK_Cyrillic_tse, 0x426, XK_Cyrillic_TSE),
        /* у У */ KEYBT(0x443, XK_Cyrillic_u, 0x423, XK_Cyrillic_U),
        /* к К */ KEYBT(0x43a, XK_Cyrillic_ka, 0x41a, XK_Cyrillic_KA),
        /* е Е */ KEYBT(0x435, XK_Cyrillic_ie, 0x415, XK_Cyrillic_IE),
        /* н Н */ KEYBT(0x43d, XK_Cyrillic_en, 0x41d, XK_Cyrillic_EN),
        /* г Г */ KEYBT(0x433, XK_Cyrillic_ghe, 0x413, XK_Cyrillic_GHE),
        /* ш Ш */ KEYBT(0x448, XK_Cyrillic_sha, 0x428, XK_Cyrillic_SHA),
        /* щ Щ */ KEYBT(0x449, XK_Cyrillic_shcha, 0x429, XK_Cyrillic_SHCHA),
        /* з З */ KEYBT(0x437, XK_Cyrillic_ze, 0x417, XK_Cyrillic_ZE),
        /* х Х */ KEYBT(0x445, XK_Cyrillic_ha, 0x425, XK_Cyrillic_HA),
        /* ъ Ъ */ KEYBT(0x44a, XK_Cyrillic_hardsign, 0x42a, XK_Cyrillic_HARDSIGN),

        /* ф Ф */ KEYBT(0x444, XK_Cyrillic_ef, 0x424, XK_Cyrillic_EF),
        /* ы Ы */ KEYBT(0x44b, XK_Cyrillic_yeru, 0x42b, XK_Cyrillic_YERU),
        /* в В */ KEYBT(0x432, XK_Cyrillic_ve, 0x412, XK_Cyrillic_VE),
        /* а А */ KEYBT(0x430, XK_Cyrillic_a, 0x410, XK_Cyrillic_A),
        /* п П */ KEYBT(0x43f, XK_Cyrillic_pe, 0x41f, XK_Cyrillic_PE),
        /* р Р */ KEYBT(0x440, XK_Cyrillic_er, 0x420, XK_Cyrillic_ER),
        /* о О */ KEYBT(0x43e, XK_Cyrillic_o, 0x41e, XK_Cyrillic_O),
        /* л Л */ KEYBT(0x43b, XK_Cyrillic_el, 0x41b, XK_Cyrillic_EL),
        /* д Д */ KEYBT(0x434, XK_Cyrillic_de, 0x414, XK_Cyrillic_DE),
        /* ж Ж */ KEYBT(0x436, XK_Cyrillic_zhe, 0x416, XK_Cyrillic_ZHE),
        /* э Э */ KEYBT(0x44d, XK_Cyrillic_e, 0x42d, XK_Cyrillic_E),
        /* \ / */ KEYBT(0x5c, 0x2f),

        /* я Я */ KEYBT(0x44f, XK_Cyrillic_ya, 0x42f, XK_Cyrillic_YA),
        /* ч Ч */ KEYBT(0x447, XK_Cyrillic_che, 0x427, XK_Cyrillic_CHE),
        /* с С */ KEYBT(0x441, XK_Cyrillic_es, 0x421, XK_Cyrillic_ES),
        /* м М */ KEYBT(0x43c, XK_Cyrillic_em, 0x41c, XK_Cyrillic_EM),
        /* и И */ KEYBT(0x438, XK_Cyrillic_i, 0x418, XK_Cyrillic_I),
        /* т Т */ KEYBT(0x442, XK_Cyrillic_te, 0x422, XK_Cyrillic_TE),
        /* ь Ь */ KEYBT(0x44c, XK_Cyrillic_softsign, 0x42c, XK_Cyrillic_SOFTSIGN),
        /* б Б */ KEYBT(0x431, XK_Cyrillic_be, 0x411, XK_Cyrillic_BE),
        /* ю Ю */ KEYBT(0x44e, XK_Cyrillic_yu, 0x42e, XK_Cyrillic_YU),
        /* . , */ KEYBT(0x2e, 0x2c)};

const KEYBT FRENCH_LOCALE[] = {
        /* ? ? */ KEYBT(0xb2, XK_twosuperior, 0xb2, XK_twosuperior),
        /* & 1 */ KEYBT(0x26, 0x31),
        /* ? 2 */ KEYBT(0xe9, 0x32),
        /* " 3 */ KEYBT(0x22, 0x33),
        /* ' 4 */ KEYBT(0x27, 0x34),
        /* ( 5 */ KEYBT(0x28, 0x35),
        /* - 6 */ KEYBT(0x2d, 0x36),
        /* ? 7 */ KEYBT(0xe8, XK_egrave, 0x37, 0x37),
        /* _ 8 */ KEYBT(0x5f, 0x38),
        /* ? 9 */ KEYBT(0xe7, XK_ccedilla, 0x39, 0x39),
        /* ? 0 */ KEYBT(0xe0, 0x29),
        /* ) ? */ KEYBT(0x29, 0xb0),
        /* = + */ KEYBT(0x3d, 0x2b),

        /* a A */ KEYBT(0x61, 0x41),
        /* z Z */ KEYBT(0x7a, 0x5a),
        /* e E */ KEYBT(0x65, 0x45),
        /* r R */ KEYBT(0x72, 0x52),
        /* t T */ KEYBT(0x74, 0x54),
        /* y Y */ KEYBT(0x79, 0x59),
        /* u U */ KEYBT(0x75, 0x55),
        /* i I */ KEYBT(0x69, 0x49),
        /* o O */ KEYBT(0x6f, 0x4f),
        /* p P */ KEYBT(0x70, 0x50),
        /* ^ ? */ KEYBT(0x5e, 0xa8),
        /* $ ? } */ KEYBT(0x24, 0xa3),

        /* q Q */ KEYBT(0x71, 0x51),
        /* s S */ KEYBT(0x73, 0x53),
        /* d D */ KEYBT(0x64, 0x44),
        /* f F */ KEYBT(0x66, 0x46),
        /* g G */ KEYBT(0x67, 0x47),
        /* h H */ KEYBT(0x68, 0x48),
        /* j J */ KEYBT(0x6a, 0x4a),
        /* k K */ KEYBT(0x6b, 0x4b),
        /* l L */ KEYBT(0x6c, 0x4c),
        /* m M */ KEYBT(0x6d, 0x4d),
        /* ? % */ KEYBT(0xf9, 0x25),
        /* * ? */ KEYBT(0x2a, 0xb5),

        /* w W */ KEYBT(0x77, 0x57),
        /* x X */ KEYBT(0x78, 0x58),
        /* c C */ KEYBT(0x63, 0x43),
        /* v V */ KEYBT(0x76, 0x56),
        /* b B */ KEYBT(0x62, 0x42),
        /* n N */ KEYBT(0x6e, 0x4e),
        /* , ? */ KEYBT(0x2c, 0x3f),
        /* ; . */ KEYBT(0x3b, 0x2e),
        /* : / */ KEYBT(0x3a, 0x2f),
        /* ! ? */ KEYBT(0x21, 0xa7)};

        const KEYBT SWISS_FRENCH_LOCALE[] = {
    /* § °*/	KEYBT(0xa7, 0xb0),
    /* 1 +*/	KEYBT(0x31, 0x2b),
    /* 2 "*/    KEYBT(0x32, 0x22),
    /* 3 **/	KEYBT(0x33, 0x2a),
    /* 4 ç*/    KEYBT(0x34, 0xe7),
    /* 5 %*/    KEYBT(0x35, 0x25),
    /* 6 &*/    KEYBT(0x36, 0x26),
    /* 7 /*/    KEYBT(0x37, 0x2f),
    /* 8 (*/    KEYBT(0x38, 0x28),
    /* 9 )*/	KEYBT(0x39, 0x29),
    /* 0 =*/	KEYBT(0x30, 0x3d),
    /* ' ?*/	KEYBT(0x27, 0x5f),
    /* ^ `*/	KEYBT(0x5e, 0x60),

    /* q Q*/	KEYBT(0x71, 0x51),
    /* w W*/	KEYBT(0x77, 0x57),
    /* e E*/	KEYBT(0x65, 0x45),
    /* r R*/    KEYBT(0x72, 0x52),
    /* t T*/	KEYBT(0x74, 0x54),
    /* z Z*/	KEYBT(0x7a, 0x5a),
    /* u U*/	KEYBT(0x75, 0x55),
    /* i I*/	KEYBT(0x69, 0x49),
    /* o O*/	KEYBT(0x6f, 0x4f),
    /* p P*/	KEYBT(0x70, 0x50),
    /* è ü*/	KEYBT(0xe8, 0xfa),
    /* ¨ !*/	KEYBT(0xa8 ,0x21),

    /* a A*/	KEYBT(0x61, 0x41),
    /* s S*/	KEYBT(0x73, 0x53),
    /* d D*/	KEYBT(0x64, 0x44),
    /* f F*/	KEYBT(0x66, 0x46),
    /* g G*/	KEYBT(0x67, 0x47),
    /* h H*/	KEYBT(0x68, 0x48),
    /* j J*/	KEYBT(0x6a, 0x4a),
    /* k K*/	KEYBT(0x6b, 0x4b),
    /* l L*/	KEYBT(0x6c, 0x4c),
    /* é ö*/	KEYBT(0xe9, 0xf6),
    /* à ä*/	KEYBT(0xe0, 0xe4),
    /* $ £*/	KEYBT(0x24, 0xa3),

    /* < >*/	KEYBT(0x3c, 0x3e),
    /* y Y*/	KEYBT(0x79, 0x59),
    /* x X*/	KEYBT(0x78, 0x58),
    /* c C*/	KEYBT(0x63, 0x43),
    /* v V*/	KEYBT(0x76, 0x56),
    /* b B*/	KEYBT(0x62, 0x42),
    /* n N*/	KEYBT(0x6e, 0x4e),
    /* m M*/	KEYBT(0x6d, 0x4d),
    /* , ;*/	KEYBT(0x2c, 0x3b),
    /* . :*/	KEYBT(0x2e, 0x3a),
    /* - _*/	KEYBT(0x2d, 0x5f)};

const KEYBT GERMAN_LOCALE[] = {
        /* ^ ? */ KEYBT(0x5f, 0xb0),
        /* 1 ! */ KEYBT(0x31, 0x21),
        /* 2 " */ KEYBT(0x32, 0x22),
        /* 3  */ KEYBT(0x33, 0xa7),
        /* 4 $ */ KEYBT(0x34, 0x24),
        /* 5 % */ KEYBT(0x35, 0x25),
        /* 6 & */ KEYBT(0x36, 0x26),
        /* 7 / */ KEYBT(0x37, 0x2f),
        /* 8 ( */ KEYBT(0x38, 0x28),
        /* 9 ) */ KEYBT(0x39, 0x29),
        /* 0 = */ KEYBT(0x30, 0x3d),
        /* ? ? */ KEYBT(0xdf, 0x3f),
        /* ` ? */ KEYBT(0x60, 0xb4),

        /* q Q */ KEYBT(0x71, 0x51),
        /* w W */ KEYBT(0x77, 0x57),
        /* e E */ KEYBT(0x65, 0x45),
        /* r R */ KEYBT(0x72, 0x52),
        /* t T */ KEYBT(0x74, 0x54),
        /* z Z */ KEYBT(0x7a, 0x5a),
        /* u U */ KEYBT(0x75, 0x55),
        /* i I */ KEYBT(0x69, 0x49),
        /* o O */ KEYBT(0x6f, 0x4f),
        /* p P */ KEYBT(0x70, 0x50),
        /* ? ? */ KEYBT(0xfc, 0xdc),
        /* + * */ KEYBT(0x2b, 0x2a),

        /* a A */ KEYBT(0x61, 0x41),
        /* s S */ KEYBT(0x73, 0x53),
        /* d D */ KEYBT(0x64, 0x44),
        /* f F */ KEYBT(0x66, 0x46),
        /* g G */ KEYBT(0x67, 0x47),
        /* h H */ KEYBT(0x68, 0x48),
        /* j J */ KEYBT(0x6a, 0x4a),
        /* k K */ KEYBT(0x6b, 0x4b),
        /* l L */ KEYBT(0x6c, 0x4c),
        /* ? ? */ KEYBT(0xf6, 0xd6),
        /* ? ? */ KEYBT(0xe4, 0xc4),
        /* ' # */ KEYBT(0x27, 0x23),

        /* y Y */ KEYBT(0x79, 0x59),
        /* x X */ KEYBT(0x78, 0x58),
        /* c C */ KEYBT(0x63, 0x43),
        /* v V */ KEYBT(0x76, 0x56),
        /* b B */ KEYBT(0x62, 0x42),
        /* n N */ KEYBT(0x6e, 0x4e),
        /* m M */ KEYBT(0x6d, 0x4d),
        /* , ; */ KEYBT(0x2c, 0x3b),
        /* . : */ KEYBT(0x2e, 0x3a),
        /* _ - */ KEYBT(0x5f, 0x2d)};


void UBPlatformUtils::initializeKeyboardLayouts()
{
    nKeyboardLayouts = 4;
    keyboardLayouts = new UBKeyboardLocale*[nKeyboardLayouts];
    keyboardLayouts[0] = new UBKeyboardLocale("English", "en", "", new QIcon(":/images/flags/en.png"), ENGLISH_LOCALE);
    keyboardLayouts[1] = new UBKeyboardLocale("Russian", "ru", "", new QIcon(":/images/flags/ru.png"),RUSSIAN_LOCALE);
    keyboardLayouts[2] = new UBKeyboardLocale("French", "fr", "", new QIcon(":/images/flags/fr.png"), FRENCH_LOCALE);
    keyboardLayouts[3] = new UBKeyboardLocale("Swiss French", "fr", "", new QIcon(":/images/flags/fr.png"), SWISS_FRENCH_LOCALE);
    keyboardLayouts[4] = new UBKeyboardLocale("German", "de", "", new QIcon(":/images/flags/de.png"), GERMAN_LOCALE);
}

void UBPlatformUtils::destroyKeyboardLayouts()
{
	for(int i=0; i<4; i++)
		delete keyboardLayouts[i];
	delete [] keyboardLayouts;
	keyboardLayouts = NULL;
}

QString UBPlatformUtils::urlFromClipboard()
{
    QString qsRet;

    // Not used on Linux

    return qsRet;
}
