package org.apache.cordova.file;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.apache.cordova.CordovaInterface;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.database.Cursor;
import android.provider.MediaStore;

public class ContentFilesystem implements Filesystem {

	private CordovaInterface cordova;
	
	public ContentFilesystem(CordovaInterface cordova) {
		this.cordova = cordova;
	}
	
	@Override
    @SuppressWarnings("deprecation")
	public JSONObject getEntryForLocalURL(LocalFilesystemURL inputURL) throws IOException {
      File fp = null;

          Cursor cursor = this.cordova.getActivity().managedQuery(inputURL.URL, new String[] { MediaStore.Images.Media.DATA }, null, null, null);
          // Note: MediaStore.Images/Audio/Video.Media.DATA is always "_data"
          int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
          cursor.moveToFirst();
          fp = new File(cursor.getString(column_index));

      if (!fp.exists()) {
          throw new FileNotFoundException();
      }
      if (!fp.canRead()) {
          throw new IOException();
      }
      try {
    	  JSONObject entry = new JSONObject();
    	  entry.put("isFile", fp.isFile());
    	  entry.put("isDirectory", fp.isDirectory());
    	  entry.put("name", fp.getName());
    	  entry.put("fullPath", "file://" + fp.getAbsolutePath());
    	  // The file system can't be specified, as it would lead to an infinite loop.
    	  entry.put("filesystem", FileUtils.APPLICATION);
          return entry;
      } catch (JSONException e) {
    	  throw new IOException();
      }
	}
	@Override
	public JSONObject getFileForLocalURL(LocalFilesystemURL inputURL,
			String fileName, JSONObject options, boolean directory) throws IOException {
		throw new IOException("Cannot create content url");
	}
	@Override
	public boolean removeFileAtLocalURL(LocalFilesystemURL inputURL)
			throws NoModificationAllowedException {
		throw new NoModificationAllowedException("Cannot remove content url");
	}
	@Override
	public boolean recursiveRemoveFileAtLocalURL(LocalFilesystemURL inputURL)
			throws NoModificationAllowedException {
		throw new NoModificationAllowedException("Cannot remove content url");
	}
	@Override
	public JSONArray readEntriesAtLocalURL(LocalFilesystemURL inputURL)
			throws FileNotFoundException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public JSONObject getParentForLocalURL(LocalFilesystemURL inputURL)
			throws IOException {
		// TODO Auto-generated method stub
		// Can probably use same impl as LFS
		return null;
	}
	@Override
	public JSONObject copyFileToURL(LocalFilesystemURL destURL, String newName,
			Filesystem srcFs, LocalFilesystemURL srcURL, boolean move)
			throws IOException, InvalidModificationException, JSONException,
			NoModificationAllowedException, FileExistsException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void readFileAtURL(LocalFilesystemURL inputURL, int start, int end,
			ReadFileCallback readFileCallback) throws IOException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public long writeToFileAtURL(LocalFilesystemURL inputURL, String data,
			int offset, boolean isBinary) throws NoModificationAllowedException {
        throw new NoModificationAllowedException("Couldn't write to file given its content URI");
    }
	@Override
	public long truncateFileAtURL(LocalFilesystemURL inputURL, long size)
			throws NoModificationAllowedException {
        throw new NoModificationAllowedException("Couldn't truncate file given its content URI");
	}

	@Override
	public String filesystemPathForURL(LocalFilesystemURL url) {
		return null;
	}

}
