package dal

import (
	"errors"
	"fmt"

	"xiaoniaokuaiyan.com/xiaoniao/entity"
	"xiaoniaokuaiyan.com/xiaoniao/util"
)

type Cart struct{}

func (c *Cart) Get(customId int) ([]entity.ProductDB, error) {
	db := util.GetSqlDB()
	strSql := "select t1.quantity, t2.* from t_cart t1 left join t_product t2 on t1.pid = t2.id where cid = ?"
	plist := []entity.ProductDB{}
	err := db.Select(&plist, strSql, customId)
	if err != nil {
		return nil, err
	}
	return plist, nil
}

func (c *Cart) Update(customId, productId, quantity int, isAdd bool) (bool, error) {
	var strSql string = "select quantity from t_cart where cid = ? and pid =?"
	db := util.GetWriteSqlDB()
	var (
		quan int
		err  error
	)
	db.Get(&quan, strSql, customId, productId)

	if quan <= 0 {
		if quantity < 1 {
			return false, errors.New("wrong param quantity")
		}
		strSql = "insert into t_cart(cid, pid, quantity) values(?,?,?);"
		_, err = db.Exec(strSql, customId, productId, quantity)
	} else {
		if isAdd {
			quantity = quan + quantity
		}
		if quantity < 1 {
			return false, errors.New("wrong param quantity")
		}
		strSql = "update t_cart set quantity = ? where cid = ? and pid = ?"
		_, err = db.Exec(strSql, quantity, customId, productId)
	}
	if err != nil {
		return false, err
	}
	return true, nil
}

func (c *Cart) Del(customId int, productIds []int) (bool, error) {
	if len(productIds) == 0 {
		return false, errors.New("wrong product id param")
	}
	var strSql = fmt.Sprintf("delete from t_cart where cid = %d and pid in(", customId)
	for _, pid := range productIds {
		strSql += fmt.Sprintf("%d,", pid)
	}
	strSql = strSql[0:len(strSql)-1] + ");"
	db := util.GetWriteSqlDB()
	_, err := db.Exec(strSql)
	if err != nil {
		return false, err
	}
	return true, nil
}

func (c *Cart) Clear(customId int) (bool, error) {
	strSql := "delete from t_cart where cid = ?"
	db := util.GetWriteSqlDB()
	_, err := db.Exec(strSql, customId)
	if err != nil {
		return false, err
	}
	return true, nil
}

var DefaultCartDal = &Cart{}