path = require('path')
ProjectUploadManager = require('../Uploads/ProjectUploadManager')
ProjectOptionsHandler = require("../Project/ProjectOptionsHandler")
ProjectDetailsHandler = require('../Project/ProjectDetailsHandler')
TemplatesPublisher = require("./TemplatesPublisher")
settings = require('settings-sharelatex')
fs = require('fs')
request = require('request')
uuid = require('node-uuid')
logger = require('logger-sharelatex')
async = require("async")


module.exports =
		
	createProjectFromZipTemplate: (req, res)->
		logger.log body:req.session.templateData, "creating project from zip"
		if !req.session.templateData?
			return res.redirect "/project"
			
		dumpPath = "#{settings.path.dumpFolder}/#{uuid.v4()}"
		writeStream = fs.createWriteStream(dumpPath)
		zipUrl = req.session.templateData.zipUrl
		if zipUrl.slice(0,12).indexOf("templates") == -1
			zipUrl = "#{settings.apis.web.url}#{zipUrl}"
		else
			zipUrl = "#{settings.apis.templates_api.url}#{zipUrl}"
		request(zipUrl).pipe(writeStream)
		writeStream.on 'close', ->
			ProjectUploadManager.createProjectFromZipArchive req.session.user._id, req.session.templateData.templateName, dumpPath, (err, project)->
				if err?
					logger.err err:err, zipUrl:zipUrl, "problem building project from zip"
					return res.send 500
				setCompiler project._id, req.session.templateData.compiler, ->
					fs.unlink dumpPath, ->
					delete req.session.templateData
					res.redirect "/project/#{project._id}"

	publishProject: (user_id, project_id, callback)->
		logger.log user_id:user_id, project_id:project_id, "receiving request to publish project as template"
		TemplatesPublisher.publish user_id, project_id, callback

	unPublishProject: (user_id, project_id, callback)->
		logger.log user_id:user_id, project_id:project_id, "receiving request to unpublish project as template"
		TemplatesPublisher.unpublish user_id, project_id, callback

	getTemplateDetails: (user_id, project_id, callback)->
		async.parallel {
			details: (cb)->
				TemplatesPublisher.getTemplateDetails user_id, project_id, cb
			description: (cb)->
				ProjectDetailsHandler.getProjectDescription project_id, cb
		}, (err, results)->
			if err?
				logger.err err:err, user_id:user_id, project_id:project_id, "something went wrong getting template details"
				return callback(err)
			details = results.details
			details.description = results.description
			callback(err, details)


setCompiler = (project_id, compiler, callback)->
	if compiler?
		ProjectOptionsHandler.setCompiler project_id, compiler, callback
	else
		callback()
