fs = require("fs")
uuid = require('node-uuid')
path = require("path")
_ = require("underscore")
logger = require("logger-sharelatex")
metrics = require("metrics-sharelatex")
Settings = require("settings-sharelatex")
Errors = require "./Errors"

module.exports = 

	writeStream: (stream, key, callback)->
		timer = new metrics.Timer("writingFile")
		callback = _.once callback
		fsPath = @_getPath(key)
		logger.log fsPath:fsPath, "writing file locally"
		writeStream = fs.createWriteStream(fsPath)
		writeStream.on "finish", ->
			timer.done()
			logger.log fsPath:fsPath, "finished writing file locally"
			callback(null, fsPath)
		writeStream.on "error", (err)->
			logger.err err:err, fsPath:fsPath, "problem writing file locally, with write stream"
			callback err
		stream.on "error", (err)->
			logger.log err:err, fsPath:fsPath, "problem writing file locally, with read stream"
			callback err
		stream.pipe writeStream

	getStream: (fsPath, _callback = (err, res)->) ->
		callback = _.once _callback
		timer = new metrics.Timer("readingFile")
		logger.log fsPath:fsPath, "reading file locally"
		readStream = fs.createReadStream(fsPath)
		readStream.on "end", ->
			timer.done()
			logger.log fsPath:fsPath, "finished reading file locally"
		readStream.on "error", (err)->
			logger.err err:err, fsPath:fsPath, "problem reading file locally, with read stream"
			if err.code == 'ENOENT'
				callback new Errors.NotFoundError(err.message), null
			else
				callback err
		callback null, readStream

	deleteFile: (fsPath, callback)->
		if !fsPath? or fsPath == ""
			return callback()
		logger.log fsPath:fsPath, "removing local temp file"
		fs.unlink fsPath, callback

	_getPath : (key)->
		if !key?
			key = uuid.v1()
		key = key.replace(/\//g,"-")
		path.join(Settings.path.uploadFolder, key)