/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#include "r1_api.hh"
#include "lisp/li_init.hh"
#include "status/status.hh"
#include "m1_info.hh"
#include "memory/array.hh"
#include "r1_res.hh"
#include "tupdate.hh"
#include "error/alert.hh"
#include "file/file.hh"

w32 m1_get_file_id(const i4_const_str &fname)
{
  int x;
  char st[30], *s;
  s=st;
  
  i4_const_str::iterator l=fname.begin();
  while (l!=fname.end() && l.get().ascii_value()!='.')
  {
    *(s++)=l.get().ascii_value();
    ++l;
  }

  *s=0;

  if (sscanf(st,"%x",&x))
    return x;
  else return 0;   
}


struct m1_texture
{
  w32 id;
  w32 last_modified;
};

int m1_find_texture(i4_array &t, int id)
{
  for (int i=0; iid < b->id)
    return -1;
  else
  if (a->id > b->id)
    return 1;
  else
    return 0;
}

inline char *remove_paths(char *src)
{
  char *ret = src;

  while (*src)
  {
    if (*src=='/' || *src=='\\')
      ret=src+1;

    src++;    
  }

  return ret;
}

void m1_copy_update(i4_bool all)
{
  int i;

  i4_status_class *stat=i4_create_status(i4gets("updating_textures"));  

  i4_array tlist(64,64);
  m1_info.get_texture_list(tlist,all);


  int t=tlist.size();  
  i4_directory_struct ds;
  i4_get_directory(i4gets("default_tga_dir"), ds, i4_T);
  
  i4_array  network_tga_list(128,128);  

  for (i=0; iupdate(i/(float)ds.tfiles);

    m1_texture new_entry;    
    
    new_entry.id            = r1_get_texture_id(*ds.files[i]);
    new_entry.last_modified = ds.file_status[i].last_modified;

    network_tga_list.add(new_entry);
  }

  if (stat)
    delete stat;

  stat = i4_create_status(i4gets("updating_textures"), i4_T);  

  i4_directory_struct ds2;
  i4_get_directory(r1_get_compressed_dir(), ds2, i4_T);

  i4_array  local_gtx_list(128,128);
  
  m1_texture temp_tex;


  for (i=0; iupdate(i/(float)ds2.tfiles))
    {
      if (stat)
        delete stat;
      return;
    }

    temp_tex.id            = m1_get_file_id(*ds2.files[i]);
    temp_tex.last_modified = ds2.file_status[i].last_modified;
    local_gtx_list.add(temp_tex);
  }

  if (stat)
    delete stat;
  stat = i4_create_status(i4gets("updating_textures"), i4_T);

  network_tga_list.sort(m1_texture_compare);
  local_gtx_list.sort(m1_texture_compare);    
  
  for (i=0; iupdate(i/(float)t))
    {
      if (stat)
        delete stat;
      return;
    }

    if (tlist[i]->null()) continue;

    temp_tex.id = r1_get_texture_id(*tlist[i]);    

    w32 network_index = network_tga_list.binary_search(&temp_tex,m1_texture_compare);
    if (network_index != -1)
    {     
      w32 local_index = local_gtx_list.binary_search(&temp_tex,m1_texture_compare);

      if (local_index==-1 || 
          (local_gtx_list[local_index].last_modified