package controllers

import (
	"encoding/json"
	"kefu_server/configs"
	"kefu_server/models"
	"kefu_server/services"
	"time"

	"github.com/astaxie/beego/orm"
	"github.com/astaxie/beego/validation"
)

// SystemController struct
type SystemController struct {
	BaseController
	SystemRepository *services.SystemRepository
}

// Prepare More like construction method
func (c *SystemController) Prepare() {

	// ShortcutRepository instance
	c.SystemRepository = services.GetSystemRepositoryInstance()

}

// Finish Comparison like destructor
func (c *SystemController) Finish() {}

// Get get info
func (c *SystemController) Get() {

	system := c.SystemRepository.GetSystem()
	if system == nil {
		c.JSON(configs.ResponseFail, "fail", nil)
	}
	c.JSON(configs.ResponseSucess, "success", &system)

}

// Put update system
func (c *SystemController) Put() {

	system := models.System{}
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &system); err != nil {
		c.JSON(configs.ResponseFail, "参数有误,请检查!", nil)
	}

	// GetAuthInfo
	auth := c.GetAuthInfo()
	admin := services.GetAdminRepositoryInstance().GetAdmin(auth.UID)
	// is root ?
	if admin.Root != 1 {
		c.JSON(configs.ResponseFail, "您没有权限修改系统设置!", nil)
	}

	// validation upload mode
	uploadConfig := services.GetUploadsConfigRepositoryInstance().GetUploadsConfig(int64(system.UploadMode))
	if uploadConfig == nil {
		c.JSON(configs.ResponseFail, "上传模型选项不存在!", nil)
	}

	// validation request
	valid := validation.Validation{}
	valid.Required(system.Title, "title").Message("系统名称不能为空!")
	valid.MaxSize(system.Title, 50, "title").Message("系统名称不能超过50个字符!")
	valid.MaxSize(system.CopyRight, 80, "copy_right").Message("版权信息不能超过80个字符!")
	valid.Required(system.Logo, "logo").Message("系统LOGO不能为空!")
	if valid.HasErrors() {
		for _, err := range valid.Errors {
			c.JSON(configs.ResponseFail, err.Message, nil)
		}
	}

	// update
	_, err := c.SystemRepository.Update(orm.Params{
		"Title":      system.Title,
		"Logo":       system.Logo,
		"CopyRight":  system.CopyRight,
		"UploadMode": system.UploadMode,
		"UpdateAt":   time.Now().Unix(),
	})
	if err != nil {
		c.JSON(configs.ResponseFail, "更新失败!", &err)
	}
	c.JSON(configs.ResponseSucess, "更新成功!", &system)
}