package http

import (
	"encoding/json"
	"go-common/app/admin/main/creative/model/app"
	"go-common/library/ecode"
	"go-common/library/log"
	bm "go-common/library/net/http/blademaster"
	"go-common/library/net/http/blademaster/render"
	"net/http"
	"sort"
	"time"
)

func viewPortal(c *bm.Context) {
	var (
		err  error
		info = &app.Portal{}
	)
	v := new(struct {
		ID int64 `form:"id"`
	})
	if err = c.Bind(v); err != nil {
		return
	}
	if v.ID == 0 {
		c.JSON(nil, ecode.RequestErr)
		return
	}
	if err = svc.DB.Debug().Model(&app.Portal{}).First(info, v.ID).Error; err != nil {
		c.JSON(nil, err)
		return
	}
	if info.ID == 0 {
		c.JSON(nil, ecode.NothingFound)
	} else {
		layout := "2006-01-02 15:04:05"
		mtime, _ := time.Parse(time.RFC3339, info.MTime)
		info.MTime = mtime.Format(layout)
		ptime, _ := time.Parse(time.RFC3339, info.PTime)
		info.PTime = ptime.Format(layout)
		ctime, _ := time.Parse(time.RFC3339, info.CTime)
		info.CTime = ctime.Format(layout)
		c.JSON(info, nil)
	}
}
func addPortal(c *bm.Context) {
	var (
		err error
	)
	v := new(struct {
		Build    int64  `form:"build"`
		BuildExp string `form:"buildexp"`
		Platform int8   `form:"platform"`
		Compare  int8   `form:"compare"`
		Pos      int16  `form:"pos"`
		Mark     int8   `form:"mark"`
		More     int8   `form:"more"`
		Type     int8   `form:"type"`
		Title    string `form:"title" validate:"required"`
		Icon     string `form:"icon" validate:"required"`
		URL      string `form:"url" validate:"required"`
		Whiteexp string `form:"whiteexp"`
		SubTitle string `form:"subtitle"`
	})
	if err = c.Bind(v); err != nil {
		return
	}
	if !checkBuild(v.BuildExp) {
		httpCode(c, "buildexp is wrong", ecode.RequestErr)
		return
	}
	if !checkWhite(v.Whiteexp) {
		httpCode(c, "whiteexp is wrong", ecode.RequestErr)
		return
	}
	m := &app.Portal{
		Build:    v.Build,
		BuildExp: v.BuildExp,
		Platform: v.Platform,
		Compare:  v.Compare,
		State:    1,
		Pos:      v.Pos,
		Mark:     v.Mark,
		More:     v.More,
		Type:     v.Type,
		Title:    v.Title,
		Icon:     v.Icon,
		URL:      v.URL,
		CTime:    time.Now().Format("2006-01-02 15:04:05"),
		MTime:    time.Now().Format("2006-01-02 15:04:05"),
		PTime:    time.Now().Format("2006-01-02 15:04:05"),
		SubTitle: v.SubTitle,
		WhiteExp: v.Whiteexp,
	}
	db := svc.DB.Create(m)
	if err = db.Error; err != nil {
		log.Error("creativeSvc.addPortal error(%v)", err)
		c.JSON(nil, err)
		return
	}
	c.JSON(map[string]interface{}{
		"id": db.Value.(*app.Portal).ID,
	}, nil)
}

func upPortal(c *bm.Context) {
	var (
		err error
		ap  = &app.Portal{}
	)
	v := new(struct {
		ID       int64  `form:"id"`
		Build    int64  `form:"build"`
		BuildExp string `form:"buildexp"`
		Platform int8   `form:"platform"`
		Compare  int8   `form:"compare"`
		Pos      int16  `form:"pos"`
		Mark     int8   `form:"mark"`
		More     int8   `form:"more"`
		Type     int8   `form:"type"`
		Title    string `form:"title" validate:"required"`
		Icon     string `form:"icon" validate:"required"`
		URL      string `form:"url" validate:"required"`
		Whiteexp string `form:"whiteexp"`
		SubTitle string `form:"subtitle"`
	})
	if err = c.Bind(v); err != nil {
		return
	}
	if !checkBuild(v.BuildExp) {
		httpCode(c, "buildexp is wrong", ecode.RequestErr)
		return
	}
	if !checkWhite(v.Whiteexp) {
		httpCode(c, "whiteexp is wrong", ecode.RequestErr)
		return
	}
	if err = svc.DB.Model(ap).Find(ap, v.ID).Error; err != nil {
		c.JSON(nil, err)
		return
	}
	if err = svc.DB.Model(&app.Portal{}).Update(map[string]interface{}{
		"id":       v.ID,
		"build":    v.Build,
		"buildexp": v.BuildExp,
		"platform": v.Platform,
		"compare":  v.Compare,
		"state":    1,
		"pos":      v.Pos,
		"mark":     v.Mark,
		"more":     v.More,
		"type":     v.Type,
		"title":    v.Title,
		"icon":     v.Icon,
		"url":      v.URL,
		"mtime":    time.Now().Format("2006-01-02 15:04:05"),
		"subtitle": v.SubTitle,
		"whiteexp": v.Whiteexp,
	}).Error; err != nil {
		log.Error("creativeSvc.addPortal error(%v)", err)
	}
	c.JSON(nil, err)
}

func downPortal(c *bm.Context) {
	var (
		err error
		ap  = &app.Portal{}
	)
	v := new(struct {
		ID int64 `form:"id"`
	})
	if err = c.Bind(v); err != nil {
		return
	}
	if v.ID == 0 {
		c.JSON(nil, ecode.RequestErr)
		return
	}
	if err = svc.DB.Model(ap).Find(ap, v.ID).Error; err != nil {
		c.JSON(nil, err)
		return
	}
	if err = svc.DB.Model(&app.Portal{ID: v.ID}).Update(map[string]interface{}{
		"id":    v.ID,
		"state": 0,
		"mtime": time.Now().Format("2006-01-02 15:04:05"),
	}).Error; err != nil {
		log.Error("creativeSvc.addPortal error(%v)", err)
	}
	c.JSON(nil, err)
}

// 入口列表查询增加subtitle和whiteexp字段
func portalList(c *bm.Context) {
	var (
		pts   []*app.Portal
		items []*app.Item
		total int64
		err   error
	)
	v := new(struct {
		Pn       int    `form:"pn" validate:"required,min=1"`
		Ps       int    `form:"ps" validate:"required,min=1"`
		State    int8   `form:"state"`
		Type     int8   `form:"type"`
		Platform string `form:"platform"`
	})
	if err = c.Bind(v); err != nil {
		return
	}
	if v.Pn < 1 {
		v.Pn = 1
	}
	if v.Ps < 20 {
		v.Ps = 20
	}
	if v.Type < 0 {
		v.Type = 0
	}
	db := svc.DB.Model(&app.Portal{}).Where("type=?", v.Type)
	if v.Platform != "" {
		db = db.Where("platform=?", atoi(v.Platform))
	}
	if v.State != 2 {
		db = db.Where("state=?", v.State)
	}
	db.Count(&total)
	if err = db.Order("ctime DESC").Offset((v.Pn - 1) * v.Ps).Limit(v.Ps).Find(&pts).Error; err != nil {
		log.Error("portalList error(%v)", err)
		c.JSON(nil, err)
		return
	}
	if len(pts) > 0 {
		items = make([]*app.Item, 0, len(pts))
		for _, v := range pts {
			i := &app.Item{}
			if v == nil {
				continue
			}
			i.ID = v.ID
			i.Build = v.Build
			i.BuildExp = v.BuildExp
			i.Platform = v.Platform
			i.Compare = v.Compare
			i.State = v.State
			i.Pos = v.Pos
			i.Mark = v.Mark
			i.More = v.More
			i.Type = v.Type
			i.Title = v.Title
			i.Icon = v.Icon
			i.URL = v.URL
			i.SubTitle = v.SubTitle
			if len(v.WhiteExp) > 0 {
				if err = json.Unmarshal([]byte(v.WhiteExp), &i.WhiteExps); err != nil {
					log.Error("json.Unmarshal buildComps failed error(%v)", err)
				}
				sort.Slice(i.WhiteExps, func(m, n int) bool {
					return i.WhiteExps[m].TP <= i.WhiteExps[n].TP
				})
			}
			ct, err := time.Parse(time.RFC3339, v.CTime)
			if err != nil {
				log.Error("ctime time.Parse error(%v)", err)
			}
			mt, err := time.Parse(time.RFC3339, v.MTime)
			if err != nil {
				log.Error("mtime time.Parse error(%v)", err)
			}
			pt, err := time.Parse(time.RFC3339, v.PTime)
			if err != nil {
				log.Error("ptime time.Parse error(%v)", err)
			}
			i.CTime = ct.Unix()
			i.MTime = mt.Unix()
			i.PTime = pt.Unix()
			items = append(items, i)
		}
	} else {
		items = []*app.Item{}
	}
	data := &app.PortalPager{
		Pn:    v.Pn,
		Ps:    v.Ps,
		Items: items,
		Total: total,
	}
	c.Render(http.StatusOK, render.MapJSON(map[string]interface{}{
		"code":    0,
		"message": "0",
		"data":    data,
	}))
}