package com.algobase.gpx;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Locale;

import android.location.Location;


public class TrkWriter {

  private BufferedWriter trk_writer;
  private File trk_file = null;
  private TrackPoint last_p;
  private int count = 0;

  private String format(String pattern, Object... args)
  { return String.format(Locale.US,pattern,args); }


  private void write_line(String line)
  { if (trk_writer == null) return;
    try {
      trk_writer.write(line);
      trk_writer.newLine();
      trk_writer.flush();
    } catch(IOException e) { }
  }


  public TrkWriter(File file)
  { trk_writer = null;
    trk_file = file;
    if (file != null) {
      try { trk_writer = new BufferedWriter(new FileWriter(file));
      } catch (IOException e) { e.printStackTrace(); }
    }
  }

  public TrkWriter(File file, boolean append)
  { trk_writer = null;
    trk_file = file;
    if (file != null) {
      try { trk_writer = new BufferedWriter(new FileWriter(file,append));
      } catch (IOException e) { e.printStackTrace(); }
    }
  }


  public File get_file() { return trk_file; }


  public void begin_track(String name) 
  { begin_track(name,null,null,null,null); }

  public void begin_track(String name, String device) 
  { begin_track(name,device,null,null,null); }

  public void begin_track(String name, String device, String info_line) 
  { begin_track(name,device,null,null,info_line); }

  public void begin_track(String name, String device, String labels, 
                                                      String text,
                                                      String info_line) 
  { 
    if (device != null && device.length() > 0)
    { if (device.length() > 12) device = device.substring(0,12);
      name += "#" + device;
     }

    write_line("T" + name); 

    if (text != null) write_line("!" + text);
    if (labels != null) write_line("@" + labels);
    if (info_line != null) write_line("I" + info_line); 

    write_line(TrackPoint.precision_comment_line()); 
    write_line(TrackPoint.precision_line()); 
    write_line(TrackPoint.track_comment_line()); 
    
   }

  public void add_point(TrackPoint p) { 
    count++;
    if (last_p == null)
      write_line(p.trk_line()); 
    else
      write_line(p.trk_line(last_p)); 
    last_p = p;
  }

  public void add_point(int id, long t, double lon, double lat, double alt, 
                        double acc, double speed, double dist, double ascent,
                        int hrate, int power, int cad, int temp)	
  { 
    TrackPoint p = new TrackPoint(id,t,lon,lat,alt,acc,speed,dist,ascent,
                                  hrate,power,cad,temp);
    add_point(p);
   }

  
  public void add_point(long t, Location loc, double alt, double speed, 
                        double dist, double ascent, int hrate, int power,
                        int cad, int temp)	
  { int id = 0;

    if (loc == null)
      add_point(id,t,0,0,0,-1, speed, dist, ascent, hrate,power,cad,temp);
    else
      add_point(id,t,loc.getLongitude(), loc.getLatitude(), alt, 
                loc.getAccuracy(), speed, dist, ascent, hrate,power,cad,temp);
   }

  


  public void add_break(long t, Location loc, double alt, double speed, 
                        double dist, double ascent, int hrate, int power,
                        int cad, int temp)	
  { int id = 1;
    add_point(id,t,loc.getLongitude(), loc.getLatitude(), alt, 
                 loc.getAccuracy(), speed, dist, ascent, hrate,power,cad,temp);
   }

  public void add_lap() { 
    write_line("L");
  }

  public int finish_track() {

    if (trk_writer == null) return 0;

    try { trk_writer.close();
    } catch(IOException e) {}
    return count;
  }

  public int num_points() { return count; }
  
}
  
