package model

import (
	"trading-go/common"
	"trading-go/response"
	"trading-go/util"
)

type Relation struct {
	Id     uint `db:"id"`
	Owner  uint `db:"owner"`
	Target uint `db:"target"`
	Type   int  `db:"type"`
}

type RelationJson struct {
	Owner  uint `json:"owner"`
	Target uint `json:"target"`
	Type   int  `json:"type"`
}

func (r RelationJson) Change() Relation {
	return Relation{
		Owner:  r.Owner,
		Target: r.Target,
		Type:   r.Type,
	}
}

func (r Relation) Creat() error {
	db := common.DB
	sqlStr := "INSERT INTO relations(owner, target, type) VALUES (:owner, :target, :type)"
	rows, err := db.NamedExec(sqlStr, r)
	if err != nil {
		return err
	}
	affected, err := rows.RowsAffected()
	if affected != 1 {
		return util.InsertFailError
	}
	return err
}

func (r Relation) Friend(uid int) ([]int64, error) {
	var friends []int64
	db := common.DB
	sqlStr := "SELECT target From relations WHERE owner = ? AND type = 1"
	err := db.Select(&friends, sqlStr, uid)
	return friends, err
}

func (r Relation) BadRelation(uid int) ([]int64, error) {
	var badRelation []int64
	db := common.DB
	sqlStr := "SELECT target From relations WHERE owner = ? AND type = 2"
	err := db.Select(&badRelation, sqlStr, uid)
	return badRelation, err
}

func (r Relation) DRelation() error {
	db := common.DB
	sqlStr := "DELETE FROM relations WHERE id = ?"
	_, err := db.Exec(sqlStr, r.Id)
	return err
}

func (r Relation) GetPaged(page, pageSize int) (rsp response.PageResponse, err error) {
	var relations []Relation
	db := common.DB
	sqlStr := "SELECT * FROM relations LIMIT ?,?"
	rsp.Page = page
	rsp.PageSize = pageSize
	err = db.Select(&relations, sqlStr, (page-1)*pageSize, pageSize)
	rsp.Data = relations
	return
}

func (r Relation) GetCnt() (cnt int, err error) {
	db := common.DB
	sqlStr := "SELECT COUNT(1) FROM relations"
	err = db.Get(&cnt, sqlStr)
	return
}