package service

import (
	"context"
	"errors"
	"icloudapp.cn/tools/service/entity"
	"icloudapp.cn/tools/service/model"
)

type Material struct {
	Base
	ctx   context.Context
	query *model.MMaterial
}

// NewMaterial 实例化素材对象
func NewMaterial(ctx context.Context) *Material {
	material := &Material{ctx: ctx}
	material.query = model.Material
	return material
}

// Info 通过ID获取素材信息
func (m *Material) Info(id int64) (*entity.Material, error) {
	return m.query.WithContext(m.ctx).Where(m.query.ID.Eq(id)).Take()
}

// Infos 通过素材ID批量获取素材信息
func (m *Material) Infos(ids ...int64) ([]*entity.Material, error) {
	return m.query.WithContext(m.ctx).Where(m.query.ID.In(ids...)).Find()
}

func (m *Material) InfoByUidAndHash(uid int64, hash string) (*entity.Material, error) {
	return m.query.WithContext(m.ctx).Where(m.query.UID.Eq(uid), m.query.Hash.Eq(hash)).Take()
}

func (m *Material) Add(material *entity.Material) (*entity.Material, error) {
	exist, err := m.InfoByUidAndHash(material.UID, material.Hash)
	if err != nil {
		return nil, err
	}
	if exist.UID > 0 {
		//如果是被删除了,就更新此数据
		if exist.Status < 1 {
			exist.Status = 1
			affected, err := m.query.WithContext(m.ctx).Where(m.query.ID.Eq(exist.ID)).Update(m.query.Status, -1)
			if err != nil {
				return nil, err
			}
			if affected.RowsAffected == 0 {
				return nil, errors.New("更新数据失败")
			}
			return exist, nil
		}
		return nil, errors.New("文件" + material.Hash + "已存在")
	}
	err = m.query.WithContext(m.ctx).Create(material)
	if err != nil {
		return nil, err
	}
	return material, nil
}

func (m *Material) Count(uid int64) int64 {
	var count int64 = 0
	var err error
	if uid > 0 {
		count, err = m.query.WithContext(m.ctx).Where(m.query.UID.Eq(uid)).Count()
	} else {
		count, err = m.query.WithContext(m.ctx).Count()
	}
	if err != nil {
		return 0
	}
	return count
}

func (m *Material) Lists(uid int64, page, pageSize int) (Page, []*entity.Material) {
	count := m.Count(uid)

	pages := m.InitPages(count, page, pageSize)
	if count == 0 {
		return pages, nil
	}
	var lists []*entity.Material
	var err error
	if uid > 0 {
		lists, err = m.query.WithContext(m.ctx).Where(m.query.UID.Eq(uid)).Offset(pages.LimitStart).Limit(pageSize).Where(m.query.UID.Eq(uid)).Find()
	} else {
		lists, err = m.query.WithContext(m.ctx).Offset(pages.LimitStart).Limit(pageSize).Find()
	}
	if err != nil {
		return pages, nil
	}
	return pages, lists
}

func (m *Material) Materials(uid int64) []*entity.Material {
	materials, _ := m.query.WithContext(m.ctx).Select(m.query.ID, m.query.UID, m.query.Name, m.query.File, m.query.Type).Where(m.query.UID.Eq(uid), m.query.Status.Eq(1)).Find()
	return materials
}
func (m *Material) Remove(ID int64) (bool, error) {
	exist, err := m.Info(ID)
	if err != nil {
		return false, err
	}
	if exist.UID == 0 {
		return false, errors.New("未找到相关记录")
	}
	//如果是被删除了,就更新此数据
	info, err := m.query.WithContext(m.ctx).Where(m.query.ID.Eq(ID)).Updates(map[string]interface{}{"Status": -1})
	if err != nil {
		return false, err
	}
	if info.RowsAffected == 0 {
		return false, errors.New("更新数据失败")
	}
	return true, nil
}