/* TODO (Twitch#1#): Раздельные иконки для ростера/меню */

#include "../inc/swilib.h"
#include "main.h"
#include "roster_icons.h"
#include "mainmenu.h"
#include "status_change.h"
#include "bookmarks.h"
#include "jabber_util.h"
#include "MUC_Enter_UI.h"
#include "JID_Enter_UI.h"
#include "cont_menu.h"
#include "revision.h"
#include "lang.h"
#include "clist_util.h"
#include "string_util.h"
#include "color.h"
#include "rect_patcher.h"
#include "moods.h"

#define MAX_MMITEMS 15       // Максимальное количество пунктов меню

extern int Is_Sounds_Enabled;
extern int Is_Vibra_Enabled;
extern char Display_Offline;
extern int Is_Autostatus_Enabled;
extern int Is_Smiles_Enabled;

extern char My_Presence;

extern const char VERSION_VERS[];

#define MM_CONTACT				1
#define MM_STATUS				2
#define MM_MUC					3
#define MM_BOOKMARK				4
#define MM_ADDCONTACT			5
#define MM_VIBRA_MODE			6
#define MM_SOUND_MODE			7
#define MM_OFFCONTACT_MODE		8
#define MM_MOODS				9
#define MM_AUTOSTATUS_MODE		10
#define MM_OPEN_CONFIG			11
#define MM_OPEN_COLOR_CONFIG	12
#define MM_ABOUT				13
#define MM_EXIT					14
#define MM_SMILE_MODE			15

void AboutDlg(void)
{
	char msg_tpl[] = LG_COPYRIGHT;
	int l;
	char* msg = malloc(l = strlen(msg_tpl) + 23 + 1);
	snprintf(msg, l, msg_tpl, VERSION_VERS, __SVN_REVISION_PREFIX__, __SVN_REVISION__, __DATE__);
	ShowMSG(0, (int)msg);
	mfree(msg);
};

char MMenu_Contents[MAX_MMITEMS - 1];
int cmMS_ICONS[MAX_MMITEMS + 1];
int MainMenu_ID;

//int Req_Close_Cont_Menu=0;
HEADER_DESC menuhdr = {0, 0, 131, 21, NULL, (int)LG_MENU, LGP_NULL};
int mmenusoftkeys[] = {0, 1, 2};
int icon_array[2];

SOFTKEY_DESC mmenu_sk[] =
{
	{0x0018, 0x0000, (int)LG_SELECT},
	{0x0001, 0x0000, (int)LG_BACK},
	{0x003D, 0x0000, (int)LGP_DOIT_PIC}
};

SOFTKEYSTAB mmenu_skt =
{
	mmenu_sk, 0
};

void mmenu_ghook(void* data, int cmd);
int mmenu_keyhook(void* data, GUI_MSG* msg);
void menuitemhandler(void* data, int curitem, void* unk);

MENU_DESC tmenu =
{
	8, mmenu_keyhook, mmenu_ghook, NULL,
	mmenusoftkeys,
	&mmenu_skt,
	0x11,
	menuitemhandler,
	NULL, //menuitems,
	NULL, //menuprocs,
	MAX_MMITEMS
};

void mmenu_ghook(void* data, int cmd)
{
	if (cmd == 0x0A)
	{
		DisableIDLETMR();
	}
}

/*
Обработчик нажатий клавиш меню. Отсюда следует вызывать необходимые действия

*/

int mmenu_keyhook(void* data, GUI_MSG* msg)
{
	int i = GetCurMenuItem(data);
	if(msg->keys == 0x18 || msg->keys == 0x3D)
	{
		switch(MMenu_Contents[i])
		{
		case MM_CONTACT:
		{
			Disp_Contact_Menu();
			break;
		}
		case MM_STATUS:
		{
			ShowStatusSelectMenu();
			break;
		}
		case MM_MUC:
		{
			Disp_MUC_Enter_Dialog(NULL, NULL, NULL);
			break;
		}
		case MM_BOOKMARK:
		{
			Get_Bookmarks_List();
			GeneralFuncF1(1);
			break;
		}
		case MM_ADDCONTACT:
		{
			Disp_JID_Enter_Dialog(NULL);
			break;
		}
		case MM_VIBRA_MODE:
		{
			Is_Vibra_Enabled = !(Is_Vibra_Enabled);
			cmMS_ICONS[MM_VIBRA_MODE] = (int)icon_array[Is_Vibra_Enabled];
			RefreshGUI();
			break;
		}
		case MM_SOUND_MODE:
		{
			Is_Sounds_Enabled = !(Is_Sounds_Enabled);
			cmMS_ICONS[MM_SOUND_MODE] = (int)icon_array[Is_Sounds_Enabled];
			RefreshGUI();
			break;
		}
		case MM_OFFCONTACT_MODE:
		{
			CList_ToggleOfflineDisplay();
			cmMS_ICONS[MM_OFFCONTACT_MODE] = (int)icon_array[Display_Offline];
			RefreshGUI();
			break;
		}
		case MM_AUTOSTATUS_MODE:
		{
			Is_Autostatus_Enabled = !(Is_Autostatus_Enabled);
			cmMS_ICONS[MM_AUTOSTATUS_MODE] = (int)icon_array[Is_Autostatus_Enabled];
			RefreshGUI();
			break;
		}
		case MM_OPEN_CONFIG:
		{
			OpenSettings();
			GeneralFuncF1(1);
			break;
		}

		case MM_OPEN_COLOR_CONFIG:
		{
			ShowSelectColorMenu();
			break;
		}
		case MM_ABOUT:
		{
			AboutDlg();
			break;
		}
		case MM_EXIT:
		{
			QuitCallbackProc(0);
			GeneralFuncF1(1);
			break;
		}
		case MM_SMILE_MODE:
		{
			Is_Smiles_Enabled = !(Is_Smiles_Enabled);
			cmMS_ICONS[MM_SMILE_MODE] = (int)icon_array[Is_Smiles_Enabled];
			RefreshGUI();
			break;
		}
		case MM_MOODS:
		{
			Show_Moods_Menu();
			break;
		}
		default:
		{
			MsgBoxError(1, (int)LG_UNKACTION);
		}
		}
		return 0;
	}
	//  Req_Close_Cont_Menu = 1;
	return 0;
}

void InitMMenuArray()
{
	for(int i = 0; i < MAX_MMITEMS; i++)MMenu_Contents[i] = 0;
}

/*
Обработчик появления пунктов динамического меню
Тут мы сами создаём каждый пункт, указывая для него иконку и текст.
При создании мы опираемся на данные массива MMenu_Contents, в котором описано,
какие пункты и в каком порядке необходимо создать.
*/
void menuitemhandler(void* data, int curitem, void* unk)
{
	WSHDR* ws;
	char test_str[48];
	void* item = AllocMenuItem(data);
	strcpy(test_str, "(ошибка)");

	switch(MMenu_Contents[curitem])
	{
	case MM_CONTACT:
	{
		strcpy(test_str, LG_CONTACT);
		break;
	}
	case MM_STATUS:
	{
		strcpy(test_str, LG_STATUS);
		break;
	}
	case MM_MUC:
	{
		strcpy(test_str, LG_MUC);
		break;
	}
	case MM_BOOKMARK:
	{
		strcpy(test_str, LG_BOOKMARK);
		break;
	}
	case MM_ADDCONTACT:
	{
		strcpy(test_str, LG_ADDCONTACT);
		break;
	}
	case MM_VIBRA_MODE:
	{
		strcpy(test_str, LG_MVIBRA);
		break;
	}
	case MM_SOUND_MODE:
	{
		strcpy(test_str, LG_MSOUND);
		break;
	}
	case MM_OFFCONTACT_MODE:
	{
		strcpy(test_str, LG_MOFFLINE);
		break;
	}
	case MM_AUTOSTATUS_MODE:
	{
		strcpy(test_str, LG_AUTOSTATUS);
		break;
	}
	case MM_OPEN_CONFIG:
	{
		strcpy(test_str, LG_SETTINGS);
		break;
	}
	case MM_OPEN_COLOR_CONFIG:
	{
		strcpy(test_str, LG_COLOR);
		break;
	}
	case MM_ABOUT:
	{
		strcpy(test_str, LG_ABOUT);
		break;
	}
	case MM_EXIT:
	{
		strcpy(test_str, LG_EXIT);
		break;
	}
	case MM_SMILE_MODE:
	{
		strcpy(test_str, LG_SMILE);
		break;
	}
	case MM_MOODS:
	{
		strcpy(test_str, LG_MOODS);
		break;
	}
	}

	ws = AllocMenuWS(data, strlen(test_str));
	ascii2ws(ws, test_str);

	SetMenuItemIconArray(data, item, cmMS_ICONS + MMenu_Contents[curitem]);
	SetMenuItemText(data, item, ws, curitem);
};

extern const char PATH_TO_PIC[128];
char ICON_INFO[128];
char ICON_STATUS[128];
char ICON_MUCM[128];
char ICON_BOOKMARK[128];
char ICON_ADDCONT[128];
//char ICON_VIBRA[128];
//char ICON_SOUND[128];
//char ICON_OFFCONTACT[128];
//char ICON_IPCSTSTUS[128];
//char ICON_AUTOSTATUS[128];
//char ICON_SMILE[128];
//char ICON_MOODS[128];
char ICON_SETTING[128];
char ICON_COLOR[128];
char ICON_ABOUT[128];
char ICON_EXIT[128];

void Init_MMIcon_array()
{
	strcpy(ICON_INFO, PATH_TO_PIC);
	strcat(ICON_INFO, "info.png");
	strcpy(ICON_MUCM, PATH_TO_PIC);
	strcat(ICON_MUCM, "conference.png");
	strcpy(ICON_BOOKMARK, PATH_TO_PIC);
	strcat(ICON_BOOKMARK, "conference.png");
	strcpy(ICON_ADDCONT, PATH_TO_PIC);
	strcat(ICON_ADDCONT, "conference.png");
	/* ICON_VIBRA
	  ICON_SOUND
	  ICON_OFFCONTACT
	  ICON_IPCSTSTUS
	  ICON_AUTOSTATUS
	  ICON_SMILE
	  ICON_MOODS*/
	strcpy(ICON_SETTING, PATH_TO_PIC);
	strcat(ICON_SETTING, "settings.png");
	strcpy(ICON_COLOR, PATH_TO_PIC);
	strcat(ICON_COLOR, "coloricon.png");
	strcpy(ICON_ABOUT, PATH_TO_PIC);
	strcat(ICON_ABOUT, "about.png");
	strcpy(ICON_EXIT, PATH_TO_PIC);
	strcat(ICON_EXIT, "exit.png");
	Roster_getIconByStatus(ICON_STATUS, My_Presence);

	for(int i = 0; i <= MAX_MMITEMS; i++)cmMS_ICONS[i] = 0;

	icon_array[1] = GetPicNByUnicodeSymbol(CBOX_CHECKED);
	icon_array[0] = GetPicNByUnicodeSymbol(CBOX_UNCHECKED);
	cmMS_ICONS[MM_VIBRA_MODE] = (int)icon_array[Is_Vibra_Enabled];
	cmMS_ICONS[MM_SOUND_MODE] = (int)icon_array[Is_Sounds_Enabled];
	cmMS_ICONS[MM_OFFCONTACT_MODE] = (int)icon_array[Display_Offline];
	cmMS_ICONS[MM_AUTOSTATUS_MODE] = (int)icon_array[Is_Autostatus_Enabled];
	cmMS_ICONS[MM_SMILE_MODE] = (int)icon_array[Is_Smiles_Enabled];

	cmMS_ICONS[MM_CONTACT] = (int)ICON_INFO;
	cmMS_ICONS[MM_STATUS] = (int)ICON_STATUS;
	cmMS_ICONS[MM_MUC] = (int)ICON_MUCM;
	cmMS_ICONS[MM_BOOKMARK] = (int)ICON_BOOKMARK;
	cmMS_ICONS[MM_ADDCONTACT] = (int)ICON_ADDCONT;
	cmMS_ICONS[MM_OPEN_CONFIG] = (int)ICON_SETTING;
	cmMS_ICONS[MM_OPEN_COLOR_CONFIG] = (int)ICON_COLOR;
	cmMS_ICONS[MM_ABOUT] = (int)ICON_ABOUT;
	cmMS_ICONS[MM_EXIT] = (int)ICON_EXIT;
	cmMS_ICONS[MM_MOODS] = (int)ICON_STATUS;
}

void MM_Show()
{
	extern const int AUTOSTATUS_ENABLED;
	extern JABBER_STATE Jabber_state;
	int n_items = 0;
	InitMMenuArray();
	Init_MMIcon_array();
	if(Jabber_state == JS_ONLINE)
	{
		MMenu_Contents[n_items++] = MM_CONTACT;
		MMenu_Contents[n_items++] = MM_STATUS;
		MMenu_Contents[n_items++] = MM_MOODS;
		MMenu_Contents[n_items++] = MM_MUC;
		MMenu_Contents[n_items++] = MM_BOOKMARK;
		MMenu_Contents[n_items++] = MM_ADDCONTACT;
	}
	MMenu_Contents[n_items++] = MM_VIBRA_MODE;
	MMenu_Contents[n_items++] = MM_SOUND_MODE;
	MMenu_Contents[n_items++] = MM_OFFCONTACT_MODE;
	if(AUTOSTATUS_ENABLED) MMenu_Contents[n_items++] = MM_AUTOSTATUS_MODE;
	MMenu_Contents[n_items++] = MM_SMILE_MODE;
	MMenu_Contents[n_items++] = MM_OPEN_CONFIG;
	MMenu_Contents[n_items++] = MM_OPEN_COLOR_CONFIG;
	MMenu_Contents[n_items++] = MM_ABOUT;
	MMenu_Contents[n_items++] = MM_EXIT;

	if(n_items)
	{
		patch_rect(&menuhdr.rc, 0, YDISP, ScreenW() - 1, HeaderH() + YDISP);
		MainMenu_ID = CreateMenu(0, 0, &tmenu, &menuhdr, 0, n_items, 0, 0);
	}
}
//EOL,EOF
