package services

import (
	"context"
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)

// 节点区域价格相关服务
type NodePriceItemService struct {
	BaseService
}

// 创建区域价格
func (this *NodePriceItemService) CreateNodePriceItem(ctx context.Context, req *pb.CreateNodePriceItemRequest) (*pb.CreateNodePriceItemResponse, error) {
	_, err := this.ValidateAdmin(ctx, 0)
	if err != nil {
		return nil, err
	}

	tx := this.NullTx()

	itemId, err := models.SharedNodePriceItemDAO.CreateItem(tx, req.Name, req.Type, req.BitsFrom, req.BitsTo)
	if err != nil {
		return nil, err
	}
	return &pb.CreateNodePriceItemResponse{NodePriceItemId: itemId}, nil
}

// 修改区域价格
func (this *NodePriceItemService) UpdateNodePriceItem(ctx context.Context, req *pb.UpdateNodePriceItemRequest) (*pb.RPCSuccess, error) {
	_, err := this.ValidateAdmin(ctx, 0)
	if err != nil {
		return nil, err
	}

	tx := this.NullTx()

	err = models.SharedNodePriceItemDAO.UpdateItem(tx, req.NodePriceItemId, req.Name, req.BitsFrom, req.BitsTo)
	if err != nil {
		return nil, err
	}
	return this.Success()
}

// 删除区域价格
func (this *NodePriceItemService) DeleteNodePriceItem(ctx context.Context, req *pb.DeleteNodePriceItemRequest) (*pb.RPCSuccess, error) {
	_, err := this.ValidateAdmin(ctx, 0)
	if err != nil {
		return nil, err
	}

	tx := this.NullTx()

	err = models.SharedNodePriceItemDAO.DisableNodePriceItem(tx, req.NodePriceItemId)
	if err != nil {
		return nil, err
	}
	return this.Success()
}

// 查找所有区域价格
func (this *NodePriceItemService) FindAllEnabledNodePriceItems(ctx context.Context, req *pb.FindAllEnabledNodePriceItemsRequest) (*pb.FindAllEnabledNodePriceItemsResponse, error) {
	_, err := this.ValidateAdmin(ctx, 0)
	if err != nil {
		return nil, err
	}

	tx := this.NullTx()

	prices, err := models.SharedNodePriceItemDAO.FindAllEnabledRegionPrices(tx, req.Type)
	if err != nil {
		return nil, err
	}
	result := []*pb.NodePriceItem{}
	for _, price := range prices {
		result = append(result, &pb.NodePriceItem{
			Id:       int64(price.Id),
			IsOn:     price.IsOn == 1,
			Name:     price.Name,
			Type:     price.Type,
			BitsFrom: int64(price.BitsFrom),
			BitsTo:   int64(price.BitsTo),
		})
	}

	return &pb.FindAllEnabledNodePriceItemsResponse{NodePriceItems: result}, nil
}

// 查找所有启用的区域价格
func (this *NodePriceItemService) FindAllEnabledAndOnNodePriceItems(ctx context.Context, req *pb.FindAllEnabledAndOnNodePriceItemsRequest) (*pb.FindAllEnabledAndOnNodePriceItemsResponse, error) {
	_, err := this.ValidateAdmin(ctx, 0)
	if err != nil {
		return nil, err
	}

	tx := this.NullTx()

	prices, err := models.SharedNodePriceItemDAO.FindAllEnabledAndOnRegionPrices(tx, req.Type)
	if err != nil {
		return nil, err
	}
	result := []*pb.NodePriceItem{}
	for _, price := range prices {
		result = append(result, &pb.NodePriceItem{
			Id:       int64(price.Id),
			IsOn:     price.IsOn == 1,
			Name:     price.Name,
			Type:     price.Type,
			BitsFrom: int64(price.BitsFrom),
			BitsTo:   int64(price.BitsTo),
		})
	}

	return &pb.FindAllEnabledAndOnNodePriceItemsResponse{NodePriceItems: result}, nil
}

// 查找单个区域信息
func (this *NodePriceItemService) FindEnabledNodePriceItem(ctx context.Context, req *pb.FindEnabledNodePriceItemRequest) (*pb.FindEnabledNodePriceItemResponse, error) {
	_, err := this.ValidateAdmin(ctx, 0)
	if err != nil {
		return nil, err
	}

	tx := this.NullTx()

	price, err := models.SharedNodePriceItemDAO.FindEnabledNodePriceItem(tx, req.NodePriceItemId)
	if err != nil {
		return nil, err
	}
	if price == nil {
		return &pb.FindEnabledNodePriceItemResponse{NodePriceItem: nil}, nil
	}
	return &pb.FindEnabledNodePriceItemResponse{NodePriceItem: &pb.NodePriceItem{
		Id:       int64(price.Id),
		IsOn:     price.IsOn == 1,
		Name:     price.Name,
		Type:     price.Type,
		BitsFrom: int64(price.BitsFrom),
		BitsTo:   int64(price.BitsTo),
	}}, nil
}
