fs = require 'fs'
logger = require 'logger-sharelatex'
uuid = require 'uuid'
_ = require 'underscore'
Settings = require 'settings-sharelatex'
request = require 'request'

module.exports = FileWriter =

	_ensureDumpFolderExists: (callback=(error)->) ->
		fs.mkdir Settings.path.dumpFolder, (error) ->
			if error? and error.code != 'EEXIST'
				# Ignore error about already existing
				return callback(error)
			callback(null)

	writeLinesToDisk: (identifier, lines, callback = (error, fsPath)->) ->
		FileWriter.writeContentToDisk(identifier, lines.join('\n'), callback)

	writeContentToDisk: (identifier, content, callback = (error, fsPath)->) ->
		callback = _.once(callback)
		fsPath = "#{Settings.path.dumpFolder}/#{identifier}_#{uuid.v4()}"
		FileWriter._ensureDumpFolderExists (error) ->
			return callback(error) if error?
			fs.writeFile fsPath, content, (error) ->
				return callback(error) if error?
				callback(null, fsPath)

	writeStreamToDisk: (identifier, stream, callback = (error, fsPath) ->) ->
		callback = _.once(callback)
		fsPath = "#{Settings.path.dumpFolder}/#{identifier}_#{uuid.v4()}"

		stream.pause()
		FileWriter._ensureDumpFolderExists (error) ->
			return callback(error) if error?
			stream.resume()

			writeStream = fs.createWriteStream(fsPath)
			stream.pipe(writeStream)

			stream.on 'error', (err)->
				logger.err {err, identifier, fsPath},	"[writeStreamToDisk] something went wrong with incoming stream"
				callback(err)
			writeStream.on 'error', (err)->
				logger.err {err, identifier, fsPath},	"[writeStreamToDisk] something went wrong with writing to disk"
				callback(err)
			writeStream.on "finish", ->
				logger.log {identifier, fsPath}, "[writeStreamToDisk] write stream finished"
				callback null, fsPath

	writeUrlToDisk: (identifier, url, callback = (error, fsPath) ->) ->
		callback = _.once(callback)
		stream = request.get(url)
		stream.on 'response', (response) ->
			if 200 <= response.statusCode < 300
				FileWriter.writeStreamToDisk identifier, stream, callback
			else
				err = new Error("bad response from url: #{response.statusCode}")
				logger.err {err, identifier, url}, err.message
				callback(err)