package service

import (
	"beeblog/models"
	"fmt"
	"github.com/beego/beego/v2/client/orm"
)

type CommentService struct {
}

func (this *CommentService) FindCommentByBlog(bid int64) ([]*models.Comment, error) {
	var comms []*models.Comment
	o := orm.NewOrm()
	_, err := o.QueryTable(&models.Comment{}).Filter("Pid", 0).Filter("BlogId", bid).OrderBy("-Ctime").All(&comms)
	if err != nil {
		return nil, err
	}
	if len(comms) > 0 {
		for i := 0; i < len(comms); i++ {
			var childs []*models.Comment
			_, childerrr := o.QueryTable(&models.Comment{}).Filter("Pid", comms[i].Id).OrderBy("-Ctime").All(&childs)
			if childerrr == nil {
				if len(childs) > 0 {
					comms[i].Childs = childs
					for j := 0; j < len(childs); j++ {
						cuser := &models.User{Id: childs[j].CuserId}
						o.Read(cuser)
						childs[j].CUser = cuser
						buser := &models.User{Id: childs[j].BuserId}
						o.Read(buser)
						childs[j].BUser = buser
					}
				}
			}
			cuser := &models.User{Id: comms[i].CuserId}
			o.Read(cuser)
			comms[i].CUser = cuser
		}
	}
	return comms, nil
}

func (this *CommentService) SaveComment(comment *models.Comment) error {
	o := orm.NewOrm()
	id, err := o.Insert(comment)
	if err == nil {
		comment.Id = id
		cuser := &models.User{Id: comment.CuserId}
		o.Read(cuser)
		comment.CUser = cuser
		if comment.BuserId != 0 {
			buser := &models.User{Id: comment.BuserId}
			o.Read(buser)
			comment.BUser = buser
		}
		return nil
	}
	return err
}

func (this *CommentService) ReadComment(comment *models.Comment) error {
	return orm.NewOrm().Read(comment)
}

func (this *CommentService) DelComment(id int64) error {
	comm := &models.Comment{Id: id}
	o := orm.NewOrm()
	err := o.Read(comm)
	if err != nil {
		return err
	}
	if comm.Pid != 0 {
		if _, err := o.QueryTable(models.Comment{}).Filter("Pid", id).Delete(); err != nil {
			fmt.Println(err)
		}

	}
	if _, err := o.Delete(comm); err != nil {
		return err
	}
	return nil
}