package controllers

import (
	"fmt"
	"os"
	"strings"
	"path/filepath"
	"strconv"
	"time"

	"github.com/astaxie/beego/logs"
	"github.com/lifei6671/mindoc/models"
	"github.com/lifei6671/mindoc/utils"
	"github.com/lifei6671/mindoc/graphics"
	"github.com/lifei6671/mindoc/conf"
	"github.com/lifei6671/mindoc/commands"
)

type SettingController struct {
	BaseController
}

func (c *SettingController) Index()  {
	c.TplName = "setting/index.tpl"

	if c.Ctx.Input.IsPost() {
		email := strings.TrimSpace(c.GetString("email", ""))
		phone := strings.TrimSpace(c.GetString("phone"))
		description := strings.TrimSpace(c.GetString("description"))

		if email == "" {
			c.JsonResult(601, "邮箱不能为空")
		}
		member := c.Member
		member.Email = email
		member.Phone = phone
		member.Description = description
		if err := member.Update(); err != nil {
			c.JsonResult(602, err.Error())
		}
		c.SetMember(*member)
		c.JsonResult(0, "ok")
	}
}

func (c *SettingController) Password()  {
	c.TplName = "setting/password.tpl"

	if c.Ctx.Input.IsPost() {
		if c.Member.AuthMethod == conf.AuthMethodLDAP {
			c.JsonResult(6009,"当前用户不支持修改密码")
		}
		password1 := c.GetString("password1")
		password2 := c.GetString("password2")
		password3 := c.GetString("password3")

		if password1 == "" {
			c.JsonResult(6003,"原密码不能为空")
		}

		if password2 == "" {
			c.JsonResult(6004,"新密码不能为空")
		}
		if count := strings.Count(password2,""); count < 6 || count > 18 {
			c.JsonResult(6009,"密码必须在6-18字之间")
		}
		if password2 != password3 {
			c.JsonResult(6003,"确认密码不正确")
		}
		if ok,_ := utils.PasswordVerify(c.Member.Password,password1) ; !ok {
			c.JsonResult(6005,"原始密码不正确")
		}
		if password1 == password2 {
			c.JsonResult(6006,"新密码不能和原始密码相同")
		}
		pwd,err := utils.PasswordHash(password2)
		if err != nil {
			c.JsonResult(6007,"密码加密失败")
		}
		c.Member.Password = pwd
		if err := c.Member.Update();err != nil {
			c.JsonResult(6008,err.Error())
		}
		c.JsonResult(0,"ok")
	}
}

// Upload 上传图片
func (c *SettingController) Upload() {
	file,moreFile,err := c.GetFile("image-file")
	defer file.Close()

	if err != nil {
		logs.Error("",err.Error())
		c.JsonResult(500,"读取文件异常")
	}

	ext := filepath.Ext(moreFile.Filename)

	if !strings.EqualFold(ext,".png") && !strings.EqualFold(ext,".jpg") && !strings.EqualFold(ext,".gif") && !strings.EqualFold(ext,".jpeg")  {
		c.JsonResult(500,"不支持的图片格式")
	}


	x1 ,_ := strconv.ParseFloat(c.GetString("x"),10)
	y1 ,_ := strconv.ParseFloat(c.GetString("y"),10)
	w1 ,_ := strconv.ParseFloat(c.GetString("width"),10)
	h1 ,_ := strconv.ParseFloat(c.GetString("height"),10)

	x := int(x1)
	y := int(y1)
	width := int(w1)
	height := int(h1)

	fmt.Println(x,x1,y,y1)

	fileName := "avatar_" +  strconv.FormatInt(time.Now().UnixNano(), 16)

	filePath := filepath.Join(commands.WorkingDirectory,"uploads" , time.Now().Format("200601") , fileName + ext)

	path := filepath.Dir(filePath)

	os.MkdirAll(path, os.ModePerm)

	err = c.SaveToFile("image-file",filePath)

	if err != nil {
		logs.Error("",err)
		c.JsonResult(500,"图片保存失败")
	}


	//剪切图片
	subImg,err := graphics.ImageCopyFromFile(filePath,x,y,width,height)

	if err != nil {
		logs.Error("ImageCopyFromFile => ",err)
		c.JsonResult(6001,"头像剪切失败")
	}
	os.Remove(filePath)

	filePath = filepath.Join(commands.WorkingDirectory,"uploads" , time.Now().Format("200601") , fileName + "_small" + ext)

	err = graphics.ImageResizeSaveFile(subImg,120,120,filePath)
	//err = graphics.SaveImage(filePath,subImg)

	if err != nil {
		logs.Error("保存文件失败 => ",err.Error())
		c.JsonResult(500,"保存文件失败")
	}

	url := "/" + strings.Replace(strings.TrimPrefix(filePath,commands.WorkingDirectory),"\\","/",-1)
	if strings.HasPrefix(url,"//") {
		url = string(url[1:])
	}

	if member,err := models.NewMember().Find(c.Member.MemberId);err == nil {
		avater := member.Avatar

		member.Avatar = url
		err := member.Update();
		if err == nil {
			if strings.HasPrefix(avater,"/uploads/") {
				os.Remove(filepath.Join(commands.WorkingDirectory,avater))
			}
			c.SetMember(*member)
		}else{
			c.JsonResult(60001,"保存头像失败")
		}
	}

	c.JsonResult(0,"ok",url)
}