package dao

import (
	"time"

	"github.com/rocboss/paopao-ce/internal/model"
)

func (d *dataServant) CreatePost(post *model.Post) (*model.Post, error) {
	post.LatestRepliedOn = time.Now().Unix()
	return post.Create(d.engine)
}

func (d *dataServant) DeletePost(post *model.Post) error {
	return post.Delete(d.engine)
}

func (d *dataServant) LockPost(post *model.Post) error {
	post.IsLock = 1 - post.IsLock
	return post.Update(d.engine)
}

func (d *dataServant) StickPost(post *model.Post) error {
	post.IsTop = 1 - post.IsTop
	return post.Update(d.engine)
}

func (d *dataServant) GetPostByID(id int64) (*model.Post, error) {
	post := &model.Post{
		Model: &model.Model{
			ID: id,
		},
	}
	return post.Get(d.engine)
}

func (d *dataServant) GetPosts(conditions *model.ConditionsT, offset, limit int) ([]*model.Post, error) {
	return (&model.Post{}).List(d.engine, conditions, offset, limit)
}

func (d *dataServant) GetPostCount(conditions *model.ConditionsT) (int64, error) {
	return (&model.Post{}).Count(d.engine, conditions)
}

func (d *dataServant) UpdatePost(post *model.Post) error {
	return post.Update(d.engine)
}

func (d *dataServant) GetUserPostStar(postID, userID int64) (*model.PostStar, error) {
	star := &model.PostStar{
		PostID: postID,
		UserID: userID,
	}

	return star.Get(d.engine)
}

func (d *dataServant) GetUserPostStars(userID int64, offset, limit int) ([]*model.PostStar, error) {
	star := &model.PostStar{
		UserID: userID,
	}

	return star.List(d.engine, &model.ConditionsT{
		"ORDER": "id DESC",
	}, offset, limit)
}

func (d *dataServant) GetUserPostStarCount(userID int64) (int64, error) {
	star := &model.PostStar{
		UserID: userID,
	}
	return star.Count(d.engine, &model.ConditionsT{})
}

func (d *dataServant) CreatePostStar(postID, userID int64) (*model.PostStar, error) {
	star := &model.PostStar{
		PostID: postID,
		UserID: userID,
	}

	return star.Create(d.engine)
}

func (d *dataServant) DeletePostStar(p *model.PostStar) error {
	return p.Delete(d.engine)
}

func (d *dataServant) GetUserPostCollection(postID, userID int64) (*model.PostCollection, error) {
	star := &model.PostCollection{
		PostID: postID,
		UserID: userID,
	}

	return star.Get(d.engine)
}

func (d *dataServant) GetUserPostCollections(userID int64, offset, limit int) ([]*model.PostCollection, error) {
	collection := &model.PostCollection{
		UserID: userID,
	}

	return collection.List(d.engine, &model.ConditionsT{
		"ORDER": "id DESC",
	}, offset, limit)
}

func (d *dataServant) GetUserPostCollectionCount(userID int64) (int64, error) {
	collection := &model.PostCollection{
		UserID: userID,
	}
	return collection.Count(d.engine, &model.ConditionsT{})
}
func (d *dataServant) GetUserWalletBills(userID int64, offset, limit int) ([]*model.WalletStatement, error) {
	statement := &model.WalletStatement{
		UserID: userID,
	}

	return statement.List(d.engine, &model.ConditionsT{
		"ORDER": "id DESC",
	}, offset, limit)
}

func (d *dataServant) GetUserWalletBillCount(userID int64) (int64, error) {
	statement := &model.WalletStatement{
		UserID: userID,
	}
	return statement.Count(d.engine, &model.ConditionsT{})
}

func (d *dataServant) CreatePostCollection(postID, userID int64) (*model.PostCollection, error) {
	collection := &model.PostCollection{
		PostID: postID,
		UserID: userID,
	}

	return collection.Create(d.engine)
}

func (d *dataServant) DeletePostCollection(p *model.PostCollection) error {
	return p.Delete(d.engine)
}

func (d *dataServant) GetPostAttatchmentBill(postID, userID int64) (*model.PostAttachmentBill, error) {
	bill := &model.PostAttachmentBill{
		PostID: postID,
		UserID: userID,
	}

	return bill.Get(d.engine)
}