#include <CrashTickPrefs.h>

extern struct Config config;

uchar importbuf[4000];

void ImportOldTick(struct Window *win)
{
   UBYTE tickpw[40];
   UBYTE filebuf[200];
   UBYTE cfgword[100];
   UBYTE buf[200];
   UBYTE tagname[200];
   UBYTE path[200];
   struct Aka *aka,*hereaka;
   struct Area *area;
   struct ConfigNode *cnode;
   struct TickNode *tn;
   struct Node4D n4d;
   BPTR fh;
   long areas;

   aka=NULL;
   area=NULL;
   cnode=NULL;

   hereaka=(struct Aka *)config.AkaList.First;

   areas=0;

   filebuf[0]=0;

   if(!OpenReq(filebuf,200,getString(PREFS_IMPORT_OLD_TITLE),win,FALSE))
      return;

   if(!(fh=Open(filebuf,MODE_OLDFILE)))
   {
      sprintf(buf,getString(PREFS_ERR_FAILED_OPEN_READ),filebuf);

      rtEZRequestTags(buf,getString(PREFS_TXT_OK),NULL,NULL,
         RT_Underscore,'_',
         RT_Window,win,
         RT_WaitPointer,TRUE,
         RT_LockWindow, TRUE,
         RTEZ_Flags, EZREQF_CENTERTEXT,
         TAG_END);

      return;
   }

   /* Pass #1: Akas */

   while(FGets(fh,importbuf,4000))
   {
      jbcpos=0;

      jbstrcpy(cfgword,importbuf,100);

      if(stricmp(cfgword,"AKA")==0 || stricmp(cfgword,"HERE")==0)
      {
         if(jbstrcpy(buf,importbuf,200))
         {
            if(Parse4D(buf,&n4d))
            {
               for(aka=(struct Aka *)config.AkaList.First;aka;aka=aka->Next)
                  if(Compare4D(&aka->Node,&n4d)==0) break;

               if(!aka)
               {
                  if(!(aka=AllocCleared(sizeof(struct Aka))))
                  {
                     DisplayBeep(NULL);
                     Close(fh);
                     return;
                  }

                  Copy4D(&aka->Node,&n4d);
                  jbAddNode(&config.AkaList,(struct jbNode *)aka);

                  if(stricmp(cfgword,"HERE")==0)
                     hereaka=aka;

                  sprintf(importbuf,getString(PREFS_IMPORT_ADDED_AKA),
                        n4d.Zone,
                        n4d.Net,
                        n4d.Node,
                        n4d.Point);

                  rtEZRequestTags(importbuf,getString(PREFS_TXT_OK),NULL,NULL,
                     RT_Underscore,'_',
                     RT_Window,win,
                     RT_WaitPointer,TRUE,
                     RT_LockWindow, TRUE,
                     RTEZ_Flags, EZREQF_CENTERTEXT,
                     TAG_END);
                }
            }
            else
            {
               sprintf(importbuf,getString(PREFS_IMPORT_INVALID_AKA),buf);

               rtEZRequestTags(importbuf,getString(PREFS_TXT_OK),NULL,NULL,
                  RT_Underscore,'_',
                  RT_Window,win,
                  RT_WaitPointer,TRUE,
                  RT_LockWindow, TRUE,
                  RTEZ_Flags, EZREQF_CENTERTEXT,
                  TAG_END);
            }
         }
      }
   }

   /* Pass #2: Areas and nodes */

   Seek(fh,0,OFFSET_BEGINNING);
   while(FGets(fh,importbuf,4000))
   {
      jbcpos=0;

      jbstrcpy(cfgword,importbuf,100);

      if(stricmp(cfgword,"FILEECHO")==0)
      {
         jbstrcpy(tagname,importbuf,80);
         jbstrcpy(path,importbuf,80);

         if(tagname[0] != 0)
         {
            for(area=(struct Aka *)config.AreaList.First;area;area=area->Next)
               if(stricmp(area->Name,tagname)==0) break;

            if(!area)
            {
               areas++;

               if(!(area=AllocCleared(sizeof(struct Area))))
               {
                  DisplayBeep(NULL);
                  Close(fh);
                  return;
               }

               jbNewList(&area->TickNodes);
               jbAddNode(&config.AreaList,(struct jbNode *)area);
               area->Aka=hereaka;

               strcpy(area->Name,tagname);
               strcpy(area->Directory,path);
            }
         }
      }
      else if(stricmp(cfgword,"AREA")==0)
      {
         if(jbstrcpy(tagname,importbuf,80))
         {
            for(area=(struct Area *)config.AreaList.First;area;area=area->Next)
               if(stricmp(area->Name,tagname)==0) break;

            if(!area)
            {
               areas++;

               if(!(area=AllocCleared(sizeof(struct Area))))
               {
                  DisplayBeep(NULL);
                  Close(fh);
                  return;
               }

               jbNewList(&area->TickNodes);
               jbAddNode(&config.AreaList,(struct jbNode *)area);

               strcpy(area->Name,tagname);
               area->Aka=hereaka;
            }
         }
      }
      else if(stricmp(cfgword,"PATH")==0)
      {
         if(jbstrcpy(path,importbuf,80))
         {
            if(area)
               strcpy(area->Directory,path);
         }
      }
      else if(stricmp(cfgword,"AKA")==0)
      {
         if(jbstrcpy(buf,importbuf,200))
         {
            if(Parse4D(buf,&n4d))
            {
               for(aka=(struct Aka *)config.AkaList.First;aka;aka=aka->Next)
                  if(Compare4D(&aka->Node,&n4d)==0)

               if(aka && area)
                  area->Aka=aka;
            }
         }
      }
      else if(stricmp(cfgword,"TO")==0)
      {
         if(jbstrcpy(buf,importbuf,200))
         {
            if(Parse4D(buf,&n4d) && area)
            {
               for(tn=(struct TickNode *)area->TickNodes.First;tn;tn=tn->Next)
                  if(Compare4D(&tn->ConfigNode->Node,&n4d)==0) break;

               /* Fanns inte redan */

               if(!tn)
               {
                  for(cnode=config.CNodeList.First;cnode;cnode=cnode->Next)
                     if(Compare4D(&cnode->Node,&n4d)==0) break;

                  /* Får väl addera en helt ny nod då... */

                  if(!cnode)
                  {
                     if(!(cnode=AllocCleared(sizeof(struct ConfigNode))))
                     {
                        DisplayBeep(NULL);
                        Close(fh);
                        return;
                     }

                    jbAddNode(&config.CNodeList,(struct jbNode *)cnode);
                    Copy4D(&cnode->Node,&n4d);

                    sprintf(buf,getString(PREFS_IMPORT_ADDED_NODE),
                       n4d.Zone,
                       n4d.Net,
                       n4d.Node,
                       n4d.Point);

                    rtEZRequestTags(buf,getString(PREFS_TXT_OK),NULL,NULL,
                       RT_Underscore,'_',
                       RT_Window,win,
                       RT_WaitPointer,TRUE,
                       RT_LockWindow, TRUE,
                       RTEZ_Flags, EZREQF_CENTERTEXT,
                       TAG_END);
                  }

                  /* Addera eländet */

                  if(!(tn=AllocCleared(sizeof(struct TickNode))))
                  {
                     DisplayBeep(NULL);
                     Close(fh);
                     return;
                  }

                  tn->ConfigNode=cnode;
                  jbAddNode(&area->TickNodes,(struct jbNode *)tn);

                  if(jbstrcpy(buf,importbuf,200))
                  {
                     if(strstr(buf,"*"))
                        tn->Flags = TICKNODE_WRITEONLY;

                     if(strstr(buf,"X"))
                        tn->Flags = TICKNODE_READONLY;
                  }
               }
            }
         }
      }
   }

   /* Pass #3: Passwords */

   Seek(fh,0,OFFSET_BEGINNING);
   while(FGets(fh,importbuf,4000))
   {
      jbcpos=0;

      jbstrcpy(cfgword,importbuf,100);

      if(stricmp(cfgword,"PW")==0 || stricmp(cfgword,"PASSWORD")==0)
      {
         jbstrcpy(buf,importbuf,50);
         jbstrcpy(tickpw,importbuf,20);

         if(buf[0] && tickpw[0])
         {
            if(Parse4D(buf,&n4d))
            {
               for(cnode=(struct ConfigNode *)config.CNodeList.First;cnode;cnode=cnode->Next)
                  if(Compare4D(&cnode->Node,&n4d)==0) break;

               if(cnode)
                  strcpy(cnode->TickPW,tickpw);
            }
         }
      }
   }

   Close(fh);

   sprintf(buf,getString(PREFS_IMPORT_FINISHED),areas);

   rtEZRequestTags(buf,getString(PREFS_TXT_OK),NULL,NULL,
      RT_Underscore,'_',
      RT_Window,win,
      RT_WaitPointer,TRUE,
      RT_LockWindow, TRUE,
      RTEZ_Flags, EZREQF_CENTERTEXT,
      TAG_END);

   config.configchanged=TRUE;
}
