package arn

import (
	"errors"

	"github.com/aerogo/aero"
	"github.com/aerogo/api"
)

// Force interface implementations
var (
	_ api.Newable = (*ClientErrorReport)(nil)
)

// Create sets the data for a new report with data we received from the API request.
func (report *ClientErrorReport) Create(ctx aero.Context) error {
	data, err := ctx.Request().Body().JSONObject()

	if err != nil {
		return err
	}

	// Get user
	user := GetUserFromContext(ctx)

	// Create report
	report.ID = GenerateID("ClientErrorReport")
	report.Message = data["message"].(string)
	report.Stack = data["stack"].(string)
	report.FileName = data["fileName"].(string)
	report.LineNumber = int(data["lineNumber"].(float64))
	report.ColumnNumber = int(data["columnNumber"].(float64))
	report.Created = DateTimeUTC()

	if user != nil {
		report.CreatedBy = user.ID
	}

	report.Save()
	return nil
}

// Save saves the client error report in the database.
func (report *ClientErrorReport) Save() {
	DB.Set("ClientErrorReport", report.ID, report)
}

// Authorize returns an error if the given API request is not authorized.
func (report *ClientErrorReport) Authorize(ctx aero.Context, action string) error {
	if action == "create" {
		return nil
	}

	return errors.New("Action " + action + " not allowed")
}