package controllers

import (
	"strconv"
	"encoding/json"
	"github.com/gorilla/mux"
	"ExpiryDatesManager/server/model"
	"ExpiryDatesManager/server/utils"
	"net/http"
)

type CreateReport struct {
	Report				model.Report
	ReportPositions 	[]model.ReportPosition
}

var GetReportsForCompany = func(w http.ResponseWriter, r *http.Request) {

	vars := mux.Vars(r)
	companyID, err := strconv.ParseUint(vars["companyId"], 10, 0)
	if err != nil {
		utils.Respond(w, utils.Message(false, "Error while decoding request body"))
		return
	}

	data := model.GetReportsForCompany(uint(companyID))
	resp := utils.Message(true, "success")
	resp["data"] = data
	utils.Respond(w, resp)
}

var GetReport = func(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
	reportID, err := strconv.ParseUint(vars["reportId"], 10, 0)
	if err != nil {
		utils.Respond(w, utils.Message(false, "Error while decoding request body"))
		return
	}

	report := model.GetReport(uint(reportID))
	positions := model.GetReportPositionsForReport(uint(reportID))
	
	resp := utils.Message(true, "success")
	resp["data"] = positions
	resp["report"] = report

	utils.Respond(w, resp)
}

var GetReportWithPositions = func(w http.ResponseWriter, r *http.Request) {

	vars := mux.Vars(r)
	reportID, err := strconv.ParseUint(vars["reportId"], 10, 0)
	if err != nil {
		utils.Respond(w, utils.Message(false, "Error while decoding request body"))
		return
	}

	data := model.GetReportPositionsForReport(uint(reportID))
	resp := utils.Message(true, "success")
	resp["data"] = data
	utils.Respond(w, resp)
}

var GetReports = func(w http.ResponseWriter, r *http.Request) {

	data := model.GetReports()
	resp := utils.Message(true, "success")
	resp["data"] = data
	utils.Respond(w, resp)
}

var CreateOrUpdateReport = func(w http.ResponseWriter, r *http.Request) {

	createReport := &CreateReport{}

	err := json.NewDecoder(r.Body).Decode(createReport)
	if err != nil {
		utils.Respond(w, utils.Message(false, "Error while decoding request body"))
		return
	}

	data := createReport.Report.CreateOrUpdate()
	if data.ID  == 0 {
		utils.Respond(w, utils.Message(false, "Database error with creating report"))
		return
	}

	for _, element := range createReport.ReportPositions {
		model.MarkAsUsed(element.ProductExpiryPositionID)
		element.ReportID = data.ID
		position := element.CreateOrUpdate()
		if position.ID  == 0 {
			utils.Respond(w, utils.Message(false, "Database error with creating report position"))
			return
		}
	}
	
	resp := utils.Message(true, "success")
	utils.Respond(w, resp)
}