package back

import (
	"os"

	"github.com/gin-gonic/gin"
)

func prepareRouterDocument() {
	router.POST("/document-insert", handlerDocumentInsert)
}

func handlerDocumentInsert(c *gin.Context) {

	man := getManagerFromContext(c)

	if man == nil {
		c.JSON(200, gin.H{
			"Error": "Отказано в доступе",
		})
		return
	}
	if man.Role != "__admin" {
		c.JSON(200, gin.H{
			"Error": "Отказано в доступе",
		})
		return
	}

	form, e := c.MultipartForm()
	if e != nil {
		logger.Println(e)
		c.JSON(200, gin.H{
			"Error": "Невозможно обработать данные",
		})
		return
	}

	var caption, extension string

	if len(form.Value["Caption"]) == 1 {
		caption = form.Value["Caption"][0]
	}
	if len(form.Value["Extension"]) == 1 {
		extension = form.Value["Extension"][0]
	}

	if len(form.File["File"]) != 1 {
		logger.Println("Количество файлов для загрузки " + string(len(form.File["File"])))
		c.JSON(200, gin.H{
			"Error": "Невозможно загрузить файл",
		})
		return
	}

	hash, e := GenerateHash(caption)
	if e != nil {
		logger.Println(e)
		c.JSON(200, gin.H{
			"Error": "Невозможно создать имя файла",
		})
		return
	}

	_, e = os.Stat(Setting.Docs)
	if os.IsNotExist(e) {
		e = os.MkdirAll(Setting.Docs, 0777)
		if e != nil {
			logger.Println(e)
			c.JSON(200, gin.H{
				"Error": "Невозможно создать каталог для зранения файлов",
			})
			return
		}
	}

	file := form.File["File"][0]

	filename := hash + "." + extension

	e = c.SaveUploadedFile(file, Setting.Docs+filename)
	if e != nil {
		logger.Println(e)
		c.JSON(200, gin.H{
			"Error": "Неудалось сохранить файл на диске сервера",
		})
		return
	}

	doc := document{}

	doc.Caption = caption
	doc.Extension = extension
	doc.Link = hash
	doc.Manager = man.ID

	e = doc.Insert()
	if e != nil {
		logger.Println(e)
		c.JSON(200, gin.H{
			"Error": "Неудалось добваить документ в базу данных",
		})

		e = os.RemoveAll(Setting.Docs + filename)
		if e != nil {
			logger.Println("ERROR: ", e)
		}

		return
	}

	c.JSON(200, gin.H{
		"Error": nil,
		"ID":    doc.ID,
	})
}
