package domain

import (
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
	"time"
)

const (
	OrderStatusReserve     = iota + 1 //预定中
	OrderStatusDeliverSome            //部分发货
	OrderStatusDeliverAll             //全部发货
)

const (
	OrderReal      = iota + 1 //实发订单
	OrderIntention            //意向订单
)

type OrderRepository interface {
	Save(dm *Order) (*Order, error)
	Remove(dm *Order) (*Order, error)
	FindOne(queryOptions map[string]interface{}) (*Order, error)
	Find(queryOptions map[string]interface{}) (int64, []*Order, error)
}

//Order 订单信息
type Order struct {
	//id
	Id int64 `json:"Id,omitempty"`
	//订单类型
	OrderType int `json:"orderType,omitempty"`
	//订单编号
	OrderCode string `json:"orderCode,omitempty"`
	//订单名称
	OrderName string `json:"orderName,omitempty"`
	//订单状态
	OrderStatus int `json:"orderStatus,omitempty"`
	//订单数量
	OrderCount int `json:"orderCount,omitempty"`
	//实际订单数量
	OrderActualCount int `json:"orderActualCount,omitempty"`
	//订单金额
	OrderAmount float64 `json:"admin_name,omitempty"`
	//订单实际金额
	OrderActualAmount float64 `json:"orderActualAmount,omitempty"`
	//订单已支付金额(货款)
	OrderPaymentAmount float64 `json:"orderPaymentAmount,omitempty"`
	//订单区域信息
	OrderRegionInfo *RegionInfo `json:"orderRegionInfo,omitempty"`

	Buyer *Buyer `json:"buyer,omitempty"`
	//合伙人编号
	PartnerId int64 `json:"partnerId,omitempty"`
	//合伙人分红百分比
	PartnerBonusPercent float64 `json:"partnerBonusPercent,omitempty"`
	//业务员分红百分比
	SalesmanBonusPercent float64 `json:"salesmanBonusPercent,omitempty"`

	//创建时间
	CreateAt time.Time `json:"createAt,omitempty"`
	//更新时间
	UpdateAt time.Time `json:"updateAt,omitempty"`

	//上一次查看时间 已读情况
	LastViewTime time.Time `json:"lastViewTime,omitempty"`
}

func (m *Order) Identify() interface{} {
	if m.Id == 0 {
		return nil
	}
	return m.Id
}

func (m *Order) Update(data map[string]interface{}) error {
	if orderType, ok := data["orderType"]; ok && orderType != 0 {
		m.OrderType = orderType.(int)
	}
	if orderCode, ok := data["orderCode"]; ok && orderCode != "" {
		m.OrderCode = orderCode.(string)
	}
	if orderName, ok := data["orderName"]; ok && orderName != "" {
		m.OrderName = orderName.(string)
	}
	if orderStatus, ok := data["orderStatus"]; ok && orderStatus != 0 {
		m.OrderStatus = orderStatus.(int)
	}
	if lastViewTime, ok := data["lastViewTime"]; ok && lastViewTime != 0 {
		m.LastViewTime = lastViewTime.(time.Time)
	}
	m.UpdateAt = time.Now()
	return nil
}

//合伙人
//订单累计分红
func (m *Order) OrderTotalBonus() float64 {
	return utils.Decimal(m.OrderActualAmount * (m.PartnerBonusPercent / 100.0))
}

//订单已收分红
func (m *Order) OrderBonusReceive() float64 {
	return utils.Decimal(m.OrderPaymentAmount * (m.PartnerBonusPercent / 100.0))
}

//订单未收分红
func (m *Order) OrderBonusWait() float64 {
	return m.OrderTotalBonus() - m.OrderBonusReceive()
}

//分红支出
func (m *Order) OrderBonusOutstanding() float64 {
	if m.OrderAmount <= m.OrderActualAmount {
		return 0
	}
	return utils.Decimal((m.OrderAmount - m.OrderActualAmount) * (m.PartnerBonusPercent / 100.0))
}

//订单被取消金额
func (m *Order) OrderAmountCancel() float64 {
	if m.OrderAmount <= m.OrderActualAmount {
		return 0
	}
	return utils.Decimal((m.OrderAmount - m.OrderActualAmount))
}

//订单是否已读
func (m *Order) IsRead() int {
	if m.UpdateAt.After(m.LastViewTime) {
		return 0
	}
	return 1
}

type OrderQueryOption struct {
	PartnerId        int64     `json:"partnerId,omitempty"`
	OrderType        int       `json:"orderType,omitempty"`
	BeginTime        time.Time `json:"beginTime,omitempty"`
	EndTime          time.Time `json:"endTime,omitempty"`
	SortByCreateTime string    `json:"sortByCreateTime,omitempty"`
	SortByUpdateTime string    `json:"sortByUpdateTime,omitempty"`
	Offset           int       `json:"offset,omitempty"`
	Limit            int       `json:"limit,omitempty"`
}

type DividendOrdersQueryOption struct {
	DetailAction   int   `json:"detailAction"`   //明细类型(0已收明细、1未收明细)
	DividendAction int   `json:"dividendAction"` //分红类型(0累计分红、1分红支出)
	StartTime      int64 `json:"startTime" `
	EndTime        int64 `json:"endTime"`
	Offset         int   `json:"offset,omitempty"`
	Limit          int   `json:"limit,omitempty"`
}