#include "../inc/swilib.h"
#include "main.h"
#include "string_util.h"
#include "clist_util.h"
#include "lang.h"
#include "smiles.h"
#include "../inc/pnglist.h"
#include "rect_patcher.h"
#include "select_smile.h"
//=================================== Команды ===========================================
int Templates_Menu_ID;
int Select_Menu_ID;

int Mode;
//0 - Смайлы
//1 - Команды
//2 - Шаблоны сообщений
//3 - Ресурсы контакта

char **commands_lines; //Массив указателей на строки
int tmpl_num=0;

void FreeTemplates(void)
{
  if (commands_lines) mfree(commands_lines);
  commands_lines=NULL;
}

extern const char COMMANDS_PATH[];
extern const char MESSAGES_PATH[];
extern const char SMILE_FILE[];

extern CLIST* cltop;
int LoadTemplates_new(void)
{
   int i=0;
   FreeTemplates();
   TRESOURCE *ResList = CList_FindContactByJID(CList_GetActiveContact()->full_name)->res_list;
   while(ResList)
    {
      if((ResList->name)&&(ResList->status!=6)) //бывает что имя ресурса незадано
      {
     commands_lines=realloc(commands_lines,(i+1)*sizeof(char *));
     commands_lines[i++]= convUTF8_to_ANSI_STR(ResList->name);
      }
      ResList=ResList->next;
    };
   return i;
}
int LoadTemplates(void)
{
  FSTATS stat;
  char fn[256];
  int f;
  unsigned int ul;
  int i;
  int fsize;
  char *p;
  char *pp;
  int c;
  FreeTemplates();
  
  switch (Mode)
  {
  case 0:
    strcpy(fn, SMILE_FILE);
    break;
  case 1:
    strcpy(fn, COMMANDS_PATH);
    break;
  case 2:
    strcpy(fn, MESSAGES_PATH);
    break;
  }

  if (GetFileStats(fn,&stat,&ul)==-1) return 0;
  if ((fsize=stat.size)<=0) return 0;
  if ((f=fopen(fn,A_ReadOnly+A_BIN,P_READ,&ul))==-1) return 0;

  p=malloc(fsize+1);
  p[fread(f,p,fsize,&ul)]=0;
  fclose(f,&ul);
  i=0;
  pp=p;
  for(;;)
  {
    c=*p;
    if (c<32)
    {
      if (pp&&(pp!=p))
      {
	commands_lines=realloc(commands_lines,(i+1)*sizeof(char *));
	commands_lines[i++]=pp;
      }
      pp=NULL;
      if (!c) break;
      *p=0;
    }
    else
    {
      if (pp==NULL) pp=p;
    }
    p++;
  }
  return i;
}


char clm_hdr_text[48];
void UpdateTemplatesMenu_header(void)
{
  switch (Mode)
  {
  case 0:
    strcpy(clm_hdr_text, LG_SELSMILE);
    break;
  case 1:
    strcpy(clm_hdr_text,LG_SELCOMMAND);
    break;
  case 2:
    strcpy(clm_hdr_text,LG_SELTEMPLATE);
    break;
  case 3:
    strcpy(clm_hdr_text,LG_CONTRESOURCES);
    break;
  }
}

HEADER_DESC tmpl_menuhdr={0,0,131,21,NULL,(int)clm_hdr_text,LGP_NULL};

int tmpl_menusoftkeys[]={0,1,2};
extern int edmessage_id;

void SetCmdToEditMessage(char *command)
{
  void *data=FindGUIbyId(edmessage_id,NULL);
  
  EDITCONTROL ec;
  ExtractEditControl(data,1,&ec);
  int pos=EDIT_GetCursorPos(data);
  WSHDR *ws_me = AllocWS(ec.pWS->wsbody[0]+strlen(command));

  switch (Mode)
  {
    case 1:
      {
        ascii2ws(ws_me, command);
        WSHDR * ws = AllocWS(512);
        wstrcpy(ws, ws_me);
        wstrcat(ws, ec.pWS);
        EDIT_SetTextToEditControl(data, 1, ws);
        EDIT_SetCursorPos(data, pos + strlen(command));
        FreeWS(ws);
      }
      break;
   
    case 0:
    case 2:
      {
	int c;
	char *p=command;
	wstrcpy(ws_me,ec.pWS);

        while(c=*p++)
          {
            wsInsertChar(ws_me,char8to16(c),pos++);
          }
        EDIT_SetTextToEditControl(data,1,ws_me);
        EDIT_SetCursorPos(data,pos);
      }
    break;
   
    case 3:
      {
        WSHDR * ws = AllocWS(512);
        ascii2ws(ws_me,command);
        if (pos==1)
        {
          pos = pos+2;
          wsprintf(ws, "%w: %w",ws_me, ec.pWS);
        }
        else wsprintf(ws, "%w%w",ec.pWS, ws_me);
        EDIT_SetTextToEditControl(data, 1, ws);
        EDIT_SetCursorPos(data, pos + strlen(command));
        FreeWS(ws);
      }
    break;    
  } 
  FreeWS(ws_me);
  FreeTemplates();
  GeneralFunc_flag1(Templates_Menu_ID,1);
}

SOFTKEY_DESC tmpl_menu_sk[]=
{
  {0x0018,0x0000,(int)LG_SELECT},
  {0x0001,0x0000,(int)LG_CANCEL},
  {0x003D,0x0000,(int)LGP_DOIT_PIC}
};

SOFTKEYSTAB tmpl_menu_skt=
{
  tmpl_menu_sk,3
};

void tmpl_menuitemhandler(void *data, int curitem, void *unk)
{
  WSHDR *ws;
  void *item=AllocMenuItem(data);
  ws=AllocMenuWS(data,strlen(commands_lines[curitem]));
  ascii2ws(ws, commands_lines[curitem]);
  SetMenuItemText(data, item, ws, curitem);
}

void tmpl_menu_ghook(void *data, int cmd)
{
  if (cmd==0x0A)
  {
    DisableIDLETMR();
  }
}

static int tmpl_menu_keyhook(void *data, GUI_MSG *msg)
{
  if ((msg->keys==0x18)||(msg->keys==0x3D))
  {
    if (tmpl_num) SetCmdToEditMessage(commands_lines[GetCurMenuItem(data)]);
       else
         {
           FreeTemplates();
           GeneralFunc_flag1(Templates_Menu_ID,1);           
         }
  }
  
  if (msg->keys==0x01)
  {
    FreeTemplates();
    GeneralFunc_flag1(Select_Menu_ID,1);
  }  
  return(0);
}

static const MENU_DESC tmpl_menu=
{
  8,tmpl_menu_keyhook,tmpl_menu_ghook,NULL,
  tmpl_menusoftkeys,
  &tmpl_menu_skt,
  0x10,
  tmpl_menuitemhandler,
  NULL, //menuitems,
  NULL, //menuprocs,
  0
};

HEADER_DESC tmpl_menuhdr;

void DispTemplatesMenu()
{
  UpdateTemplatesMenu_header();
  if (Mode == 3) tmpl_num=LoadTemplates_new();
  else tmpl_num=LoadTemplates();
  patch_header(&tmpl_menuhdr);
  Templates_Menu_ID = CreateMenu(0,0,&tmpl_menu,&tmpl_menuhdr,0,tmpl_num,0,0);
}

//================================== Меню выбора ===============================
#define SEL_MENU_ITEMS_NUM 5

void select_smile(GUI * data)
{
  Mode = 0;
  //DispTemplatesMenu();
  void * ed_gui = FindGUIbyId(edmessage_id, NULL);
  CreateSmileSelectGUI(ed_gui);
  GeneralFunc_flag1(Select_Menu_ID, 1);
}

void select_command(GUI * data)
{
  Mode = 1;
  DispTemplatesMenu();
  GeneralFunc_flag1(Select_Menu_ID, 1);
}

void select_template(GUI * data)
{
  Mode = 2;
  DispTemplatesMenu();
  GeneralFunc_flag1(Select_Menu_ID, 1);
}

void select_nick(GUI * data)
{
  Mode = 3;
  DispTemplatesMenu();
  GeneralFunc_flag1(Select_Menu_ID, 1);
}

void select_close(GUI * data)
{
  GeneralFunc_flag1(edmessage_id, 1);
  GeneralFunc_flag1(Select_Menu_ID, 1);
}

HEADER_DESC sel_menu_header={0,0,131,21,NULL,(int)LG_SELECT2,LGP_NULL};

int sel_menu_softkeys[]={0,1,2};

MENUITEM_DESC sel_menu_items[SEL_MENU_ITEMS_NUM]=
{
  {NULL, (int)LG_SMILE,         LGP_NULL, NULL, NULL, MENU_FLAG3, MENU_FLAG2},
  {NULL, (int)LG_COMMANDS,      LGP_NULL, NULL, NULL, MENU_FLAG3, MENU_FLAG2},
  {NULL, (int)LG_MSGTEMPLATE,   LGP_NULL, NULL, NULL, MENU_FLAG3, MENU_FLAG2},
  {NULL, (int)LG_CONTRESOURCE,  LGP_NULL, NULL, NULL, MENU_FLAG3, MENU_FLAG2},
  {NULL, (int)LG_CLOSEDLG,      LGP_NULL, NULL, NULL, MENU_FLAG3, MENU_FLAG2},
};

const MENUPROCS_DESC sel_menu_procs[SEL_MENU_ITEMS_NUM]=
{
  select_smile,
  select_command,
  select_template,
  select_nick,
  select_close
};

SOFTKEY_DESC sel_menu_sk[]=
{
  {0x0018,0x0000,(int)LG_SELECT},
  {0x0001,0x0000,(int)LG_BACK},
  {0x003D,0x0000,(int)LGP_DOIT_PIC}
};

SOFTKEYSTAB sel_menu_skt=
{
  tmpl_menu_sk,3
};

void sel_menu_ghook(void *data, int cmd)
{
  if (cmd==0x0A)
  {
    DisableIDLETMR();
  }
}

void AddSmile(GUI *data);

MENU_DESC sel_menu_struct=
{
  8, NULL, sel_menu_ghook, NULL,
  sel_menu_softkeys,
  &sel_menu_skt,
  0x11,
  NULL,
  sel_menu_items, //menuitems,
  sel_menu_procs, //menuprocs,
  SEL_MENU_ITEMS_NUM
};

void DispSelectMenu()
{
  FSTATS fstat;
  unsigned int io_error = NULL;
  int to_remove[SEL_MENU_ITEMS_NUM + 1];
  int n = NULL;
  
  if (GetFileStats(SMILE_FILE, &fstat, &io_error) == -1)
    to_remove[++n] = 0; // Не показываем пункт "Смайлы"
  if (GetFileStats(COMMANDS_PATH, &fstat, &io_error) == -1)
    to_remove[++n] = 1; // Не показываем пункт "Комманды"
  if (GetFileStats(MESSAGES_PATH, &fstat, &io_error) == -1)
    to_remove[++n] = 2; // Не показываем пункт "Шаблоны"
  
#ifndef NEWSGOLD
  to_remove[++n] = 4; // Не показываем пункт "Закрыть" для сголд
#endif
  
  to_remove[0] = n;
  if (n == SEL_MENU_ITEMS_NUM) return;
  
  patch_header(&sel_menu_header);
  Select_Menu_ID = CreateMenu(0, 0, &sel_menu_struct, &sel_menu_header, 0, SEL_MENU_ITEMS_NUM, 0, to_remove);
}
