You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: stats_common.go
    path of file: ./repos/podman/libpod
    
    the code of the file until where you have to start completion: //go:build !remote && (linux || freebsd)

package libpod

import (
	"fmt"

	"github.com/containers/podman/v5/libpod/define"
)

// GetContainerStats gets the running stats for a given container.
// The previousStats is used t
    
func (c *Container) GetContainerStats(previousStats *define.ContainerStats) (*define.ContainerStats, error) {
	stats := new(define.ContainerStats)
	stats.ContainerID = c.ID()
	stats.Name = c.Name()

	if c.config.NoCgroups {
		return nil, fmt.Errorf("cannot run top on container %s as it did not create a cgroup: %w", c.ID(), define.ErrNoCgroups)
	}

	if !c.batched {
		c.lock.Lock()
		defer c.lock.Unlock()
		if err := c.syncContainer(); err != nil {
			return stats, err
		}
	}

	// returns stats with the fields' default values respective of their type
	if c.state.State != define.ContainerStateRunning && c.state.State != define.ContainerStatePaused {
		return stats, nil
	}

	if previousStats == nil {
		previousStats = &define.ContainerStats{
			// if we have no prev stats use the container start time as prev time
			// otherwise we cannot correctly calculate the CPU percentage
			SystemNano: uint64(c.state.StartedTime.UnixNano()),
		}
	}

	netStats, err := getContainerNetIO(c)
	if err != nil {
		return nil, err
	}
	stats.Network = netStats

	if err := c.getPlatformContainerStats(stats, previousStats); err != nil {
		return nil, err
	}
	return stats, nil
}