/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
</copyright> */

/* /////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
NOTES:

	For newFile, only the 'uri' is required, if contents is empty, such
	empty file will be created. 'contents' should be a string to be saved
	as the file. 'contentType' is the mime type of the file.
	
	Core API reference in NINJA: this.application.ninja.coreIoApi
	
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////// */
//
var Montage = 	require("montage/core/core").Montage,
	Component = require("montage/ui/component").Component;
////////////////////////////////////////////////////////////////////////
//Exporting as File I/O
exports.FileIo = Montage.create(Component, {
	////////////////////////////////////////////////////////////////////
    //Creating new file
    newFile: {
    	enumerable: true,
    	value: function(file) {
    		//Checking for API to be available
    		if (!this.application.ninja.coreIoApi.cloudAvailable()) {
    			//API not available, no IO action taken
    			return null;
    		}
    		//Peforming check for file to exist
    		var check = this.application.ninja.coreIoApi.fileExists({uri: file.uri}), status, create;
    		//Upon successful check, handling results
    		if (check.success) {
    			//Handling status of check
    			switch (check.status) {
    				case 204:
    					//Storing status to be returned (for UI handling)
    					status = check.status;
    					break;
    				case 404:
    					//File does not exists, ready to be created
    					create = this.application.ninja.coreIoApi.createFile(file);
    					status = create.status;
    					break;
    				default:
    					//Unknown Error
    					status = 500;
    					break;
    			}
	   		} else {
	    		//Unknown Error
	    		status = 500;
    		}
    		//Returning resulting code
    		return status;
		    //	204: File exists (not created) | 400: File exists | 404: File does not exists
		    //	201: File succesfully created | 500: Unknown
    	}
    },
    ////////////////////////////////////////////////////////////////////
    //Reading contents from file
    readFile: {
    	enumerable: true,
    	value: function(file) {
    		//Checking for API to be available
    		if (!this.application.ninja.coreIoApi.cloudAvailable()) {
    			//API not available, no IO action taken
    			return null;
    		}
    		//Peforming check for file to exist
    		var check = this.application.ninja.coreIoApi.fileExists({uri: file.uri}), status, create, result;
    		//Upon successful check, handling results
    		if (check.success) {
    			//Handling status of check
    			switch (check.status) {
    				case 204:
    					//File exists
    					result = {};
    					result.content = this.application.ninja.coreIoApi.readFile(file).content;
    					result.details = this.infoFile(file);
    					status = check.status;
    					break;
    				case 404:
    					//File does not exists
    					status = check.status;
    					break;
    				default:
    					//Unknown Error
    					status = 500;
    					break;
    			}
	   		} else {
	    		//Unknown Error
	    		status = 500;
    		}
    		//Returning status and result (null if none)
    		return {status: status, file: result};
    		//Status Codes
    		//	204: File exists | 404: File does not exists | 500: Unknown
    	}
    },
    ////////////////////////////////////////////////////////////////////
    //Saving file (existing file or creates and saves if none exists)
    saveFile: {
    	enumerable: true,
    	value: function(file) {
    		//Checking for API to be available
    		if (!this.application.ninja.coreIoApi.cloudAvailable()) {
    			//API not available, no IO action taken
    			return null;
    		}
    		//Peforming check for file to exist
    		var check = this.application.ninja.coreIoApi.fileExists({uri: file.uri}), status, result;
    		//Upon successful check, handling results
    		if (check.success) {
    			//Handling status of check
    			switch (check.status) {
    				case 204:
    					//File exists
    					result = this.application.ninja.coreIoApi.updateFile(file);
    					status = 204;
    					break;
    				case 404:
    					//File does not exists, ready to be created
    					result = this.application.ninja.coreIoApi.createFile(file);
    					status = 404;
    					break;
    				default:
    					//Unknown Error
    					status = 500;
    					break;
    			}
	   		} else {
	    		//Unknown Error
	    		status = 500;
    		}
    		//Returning status and result (null if none)
    		return {status: status, result: result};
    		//Status Codes
    		//	204: File exists | 404: File does not exists | 500: Unknown
    	}
    },
    ////////////////////////////////////////////////////////////////////
    //TODO: Add functionality
    deleteFile: {
    	enumerable: true,
    	value: function() {
    		//Checking for API to be available
    		if (!this.application.ninja.coreIoApi.cloudAvailable()) {
    			//API not available, no IO action taken
    			return null;
    		}
    		//
    	}
    },
    ////////////////////////////////////////////////////////////////////
    //TODO: Add functionality
    copyFile: {
    	enumerable: true,
    	value: function() {
    		//Checking for API to be available
    		if (!this.application.ninja.coreIoApi.cloudAvailable()) {
    			//API not available, no IO action taken
    			return null;
    		}
    		//
    	}
    },
    ////////////////////////////////////////////////////////////////////
    //
    infoFile: {
    	enumerable: true,
    	value: function(file) {
    		//Checking for API to be available
    		if (!this.application.ninja.coreIoApi.cloudAvailable()) {
    			//API not available, no IO action taken
    			return null;
    		}
    		//
    		var check = this.application.ninja.coreIoApi.fileExists({uri: file.uri}), details;
    		//
    		if (check.success) {
    			//Handling status of check
    			switch (check.status) {
    				case 204:
    					//File exists
    					details = JSON.parse(this.application.ninja.coreIoApi.isFileWritable(file).content);
    					details.uri = file.uri;
    					details.name = this.getFileNameFromPath(file.uri);
    					details.extension = details.name.split('.')[details.name.split('.').length-1];
    					details.status = 204;
    					break;
    				case 404:
    					//File does not exists, ready to be created
    					details = {status: 404, uri: file.uri, name: this.getFileNameFromPath(file.uri)};
    					break;
    				default:
    					//Unknown Error
    					details = {status: 500, uri: file.uri, name: this.getFileNameFromPath(file.uri)};
    					break;
    			}
	   		} else {
	    		//Unknown Error
	    		details = {status: 500, uri: file.uri, name: this.getFileNameFromPath(file.uri)};
    		}
    		return details;
    	}
    },
    ////////////////////////////////////////////////////////////////////
    //
    getFileNameFromPath : {
        value: function(path) {
            path = path.replace(/[/\\]$/g,"");
            path = path.replace(/\\/g,"/");
            return path.substr(path.lastIndexOf('/') + 1);
        }
    }
    ////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////   
});
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////