package com.algobase.share.network;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import java.io.InputStream;
import java.io.InputStreamReader;

import java.io.OutputStream;
import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;
import java.net.URLConnection;
import java.net.URL;


public class MultipartUtility {

  private HttpURLConnection httpConn;
  private String charset;
  private OutputStream outputStream;
  private String boundary;


  public MultipartUtility(String requestURL, String auth, String chset) 
                                                          throws IOException
  { charset = chset;

    // creates a unique boundary based on time stamp
    boundary = "===" + System.currentTimeMillis() + "===";

    URL url = new URL(requestURL);
    httpConn = (HttpURLConnection) url.openConnection();
    
    httpConn.setRequestMethod("POST");
    httpConn.setUseCaches(false);
    httpConn.setDoOutput(true); // indicates POST method
    httpConn.setDoInput(true);

    if (auth != null) 
      httpConn.setRequestProperty("Authorization",auth);

    httpConn.setRequestProperty("Content-Type",
                                "multipart/form-data; boundary=" + boundary);

    httpConn.setRequestProperty("User-Agent", "sTracks.algobase.com");

    outputStream = httpConn.getOutputStream();
  }


  void write(String s) throws IOException { 
    outputStream.write((s+"\r\n").getBytes()); 
  }


  public void addField(String name, String value) throws IOException
  { write("--" + boundary);
    write("Content-Disposition: form-data; name=\"" + name + "\"");
    write("Content-Type: text/plain; charset=" + charset);
    write("");
    write(value);
    outputStream.flush();
  }


public void addFile(String name, File file) throws IOException 
{ String fname = file.getName();

  write("--" + boundary);
  write("Content-Disposition: form-data; name=\"" + name + 
                                         "\"; filename=\"" + fname + "\"");

//write("Content-Type: " + URLConnection.guessContentTypeFromName(fname));
  write("Content-Type: application/octet-stream");

  write("Content-Transfer-Encoding: binary");
  write("");
  outputStream.flush();
  
  FileInputStream inputStream = new FileInputStream(file);

  byte[] buf = new byte[4096];

  int bytesRead = -1;

  while ((bytesRead = inputStream.read(buf)) != -1) { 
    outputStream.write(buf, 0, bytesRead);
  }

  inputStream.close();
  outputStream.flush();
}


public void addHeader(String name, String value)  throws IOException
{ write(name + ": " + value);
  outputStream.flush();
}


public String connect()
{ String result = null;

  StringBuilder builder = new StringBuilder();

  try {

     write("");
     outputStream.flush();
     write("--" + boundary + "--");
     outputStream.close();

     InputStream in;

     if (httpConn.getResponseCode() < 400)
       in = httpConn.getInputStream();
     else
       in = httpConn.getErrorStream();

     char[] buf = new char[1024];
     int n = 0;
     InputStreamReader reader = new InputStreamReader(in);
     while ((n=reader.read(buf,0,buf.length)) != -1) builder.append(buf,0,n);
     reader.close();

     httpConn.disconnect();

   } catch (Exception ex) {}

  return (builder.length() == 0) ? null : builder.toString();
}


}


