package data

import (
	"PaymentCenter/app/http/entities"
	"PaymentCenter/app/models/ordersmodel"
	"PaymentCenter/app/utils/snowflake"
	"database/sql"
	"xorm.io/builder"
	"xorm.io/xorm"
)

type OrderRepo struct {
	repo xorm.Interface
}

func NewOrderRepo(repo xorm.Interface) *OrderRepo {
	return &OrderRepo{
		repo: repo,
	}
}

func (m *OrderRepo) OrderList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.Orders) (int64, error) {
	repo := m.repo.Where(conn)
	if pageFilter.Page > 0 {
		repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1))
	}
	return repo.Desc("create_time").FindAndCount(orderList)
}

func (m *OrderRepo) OrderInsertOne(order *ordersmodel.Orders) (int64, error) {
	order.Id = snowflake.GetID()
	return m.repo.InsertOne(order)
}

func (m *OrderRepo) OrderDelete(order *ordersmodel.Orders, conn builder.Cond) (int64, error) {
	return m.repo.Where(conn).Delete(order)
}

// columns 参数为要更新的字段
func (m *OrderRepo) OrderUpdate(order *ordersmodel.Orders, conn builder.Cond, columns ...string) (int64, error) {
	return m.repo.Where(conn).MustCols(columns...).Update(order)
}

func (m *OrderRepo) OrdersBackendList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.OrdersBackendList) (int64, error) {
	repo := m.repo.Select(`orders.*, merchant.name as merchant_name, app.app_name, pay_channel.pay_name`).
		Where(conn)
	if pageFilter.Page > 0 {
		repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1))
	}
	repo = repo.Join("left", "app", "app.id = orders.app_id").
		Join("left", "merchant", "merchant.id = orders.merchant_id").
		Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id")
	return repo.Desc("orders.create_time").FindAndCount(orderList)
}

func (m *OrderRepo) OrdersLeftPayChannelList(conn builder.Cond, pageFilter entities.PageRequest, orderList *[]ordersmodel.OrdersLeftPayChannelList) error {
	repo := m.repo.Select(`orders.*,pay_channel.channel_type,pay_channel.app_id ,pay_channel.ext_json`).
		Where(conn)
	if pageFilter.Page > 0 {
		repo = repo.Limit(pageFilter.PageSize, pageFilter.PageSize*(pageFilter.Page-1))
	}
	repo = repo.Join("left", "pay_channel", "pay_channel.id = orders.pay_channel_id")
	return repo.Find(orderList)
}

func (m *OrderRepo) OrderFindOne(order *ordersmodel.Orders, conn builder.Cond, columns ...string) (*ordersmodel.Orders, error) {
	has, err := m.repo.Where(conn).Get(order)
	if !has {
		return nil, sql.ErrNoRows
	}
	return order, err
}