package mysql

import orm "duoduo/database"

type Order struct {
	CreateTime            string `gorm:"column:create_time" json:"createTime"`
	GoodsName             string `gorm:"column:goods_name" json:"goodsName"`
	GoodsThumbnailURL     string `gorm:"column:goods_thumbnail_url" json:"goodsThumbnailUrl"`
	JSONData              string `gorm:"column:json_data" json:"jsonData"`
	OrderGroupSuccessTime string `gorm:"column:order_group_success_time" json:"orderGroupSuccessTime"`
	OrderID               string `gorm:"column:order_id" json:"orderId"`
	OrderStatus           int    `gorm:"column:order_status" json:"orderStatus"`
	OrderStatusDesc       string `gorm:"column:order_status_desc" json:"orderStatusDesc"`
	PID                   string `gorm:"column:p_id" json:"pId"`
	PromotionAmount       int    `gorm:"column:promotion_amount" json:"promotionAmount"`
	UpdateTime            string `gorm:"column:update_time" json:"updateTime"`
}

// TableName sets the insert table name for this struct type
func (o *Order) TableName() string {
	return "order"
}

func (o *Order) Create() (Order, error) {
	var doc Order
	result := orm.Eloquent.Table(o.TableName()).Create(&o)
	if result.Error != nil {
		err := result.Error
		return doc, err
	}
	doc = *o
	return doc, nil
}

func (o *Order) GetNum() int {
	var count int
	tableCount := orm.Eloquent.Table(o.TableName()).Where("order_id = ? ", o.OrderID)
	tableCount.Count(&count)
	return count
}

func (o *Order) GetAmount(openId string) (Wallet, error) {
	var wallet Wallet

	//历史总收益: 0,1,2,3,5 求和
	//今日预估收益:0,1,2,3 求和
	//昨日预估收益:0,1,2,3 求和
	//近30日预估收益:0,1,2,3,5 求和
	//可体现金额:5求和-已体现金额
	//已体现金额:提现记录求和
	//历史总收益
	err := orm.Eloquent.Select("SUM(promotion_amount) as total_amount").Where("order_status in (0,1,2,3,5) and open_id = ? ", openId).Table(o.TableName()).First(&wallet).Error

	if err != nil {
		return wallet, err
	}
	//今日收益
	err = orm.Eloquent.Select("SUM(promotion_amount) as today_amount").Where("order_status in (0,1,2,3) and open_id = ? and DATE(order_group_success_time) = curdate() ", openId).Table(o.TableName()).First(&wallet).Error

	if err != nil {
		return wallet, err
	}
	//昨日收益
	err = orm.Eloquent.Select("SUM(promotion_amount) as yesterday_amount").Where("order_status in (0,1,2,3) and open_id = ? and DATE(order_group_success_time) = date_sub(curdate(),interval 1 day) ", openId).Table(o.TableName()).First(&wallet).Error

	if err != nil {
		return wallet, err
	}
	//近30日收益
	err = orm.Eloquent.Select("SUM(promotion_amount) as lately_amount").Where("order_status in (0,1,2,3) and open_id = ? and DATE(order_group_success_time) >= date_sub(curdate(),interval 30 day) ", openId).Table(o.TableName()).First(&wallet).Error

	if err != nil {
		return wallet, err
	}

	//上个月结算收益
	err = orm.Eloquent.Select("SUM(promotion_amount) as available_amount").Where("order_status = 5 and open_id = ? and DATE(order_group_success_time) >= date_sub(date_sub(date_format(now(),'%y-%m-%d'),interval extract(day from now()) day),interval 0 month) ", openId).Table(o.TableName()).First(&wallet).Error

	if err != nil {
		return wallet, err
	}

	return wallet, nil

}

// 更新
func (o *Order) Update(orderId string) (update Order, err error) {
	if err = orm.Eloquent.Table(o.TableName()).Where("order_id = ?", orderId).First(&update).Error; err != nil {
		return
	}

	//参数1:是要修改的数据
	//参数2:是修改的数据
	if err = orm.Eloquent.Table(o.TableName()).Model(&update).Updates(&o).Error; err != nil {
		return
	}
	return
}