#include <CrashTick.h>
#include <crc.h>
#include <clib/dos_protos.h>

extern struct Config config;

short addfailed;

void AddLine(struct jbList *list,uchar *string)
{
   struct TickLine *tickline;

   if(!(tickline=AllocCleared(sizeof(struct TickLine))))
   {
      addfailed=TRUE;
      return;
   }

   strcpy(tickline->line,string);
//   printf("string: %s\n",string);
   jbAddNode(list,(struct jbNode *)tickline);
}

short Hatch(uchar *filename,uchar *areaname,uchar *desc,uchar *replace,uchar *magic)
{
   struct Area *area;
   struct jbList tick;
   ulong crc;
   uchar line[200],addr[30];
   short res;

   PrepareTickHatch();
   jbNewList(&tick);

   printf("\n");

   LogWrite(1,TICKINFO,getString(TXT_HATCHING_FILE),filename);

   for(area=(struct Area *)config.AreaList.First;area;area=area->Next)
      if(stricmp(area->Name,areaname)==0) break;

   if(!area)
   {
      LogWrite(1,TICKERR,getString(ERR_UNKNOWN_AREA),areaname);
      return(10);
   }

   if(!CalcCRC(filename,&crc))
   {
      LogWrite(1,TICKERR,getString(ERR_FAILED_OPEN_READ),filename);
      return(10);
   }

   addfailed=FALSE;

   AddLine(&tick,"Created by CrashTick "VERSION" (c) Johan Billing");

   sprintf(line,"File %s",FilePart(filename));
   AddLine(&tick,line);

   sprintf(line,"Desc %s",desc);
   AddLine(&tick,line);

   sprintf(line,"Area %s",area->Name);
   AddLine(&tick,line);

   sprintf(line,"Crc %08lX",crc);
   AddLine(&tick,line);

   if(area->Aka->Node.Point)
   {
      sprintf(addr,"%lu:%lu/%lu.%lu",
         area->Aka->Node.Zone,
         area->Aka->Node.Net,
         area->Aka->Node.Node,
         area->Aka->Node.Point);
   }
   else
   {
      sprintf(addr,"%lu:%lu/%lu",
         area->Aka->Node.Zone,
         area->Aka->Node.Net,
         area->Aka->Node.Node);
   }

   sprintf(line,"Origin %s",addr);
   AddLine(&tick,line);

   sprintf(line,"From %s",addr);
   AddLine(&tick,line);

   if(replace[0]!=0)
   {
      sprintf(line,"Replaces %s",replace);
      AddLine(&tick,line);
   }

   if(magic[0]!=0)
   {
      sprintf(line,"Magic %s",magic);
      AddLine(&tick,line);
   }

   if(addfailed)
   {
      jbFreeList(&tick,sizeof(struct TickLine));
      LogWrite(1,TICKERR,getString(ERR_OUT_OF_MEMORY));
      return(10);
   }

   res=0;

   if(!WriteTick(&tick,area,filename))
      res=10;

   jbFreeList(&tick,sizeof(struct TickLine));
   Announce();
   ProcessWriteStats();
   return(res);
}
