package storage

import (
	"encoding/binary"
	"encoding/hex"
	"errors"
	"strings"

	"github.com/chrislusf/seaweedfs/go/glog"
)

type FileId struct {
	VolumeId VolumeId
	Key      uint64
	Hashcode uint32
}

func NewFileIdFromNeedle(VolumeId VolumeId, n *Needle) *FileId {
	return &FileId{VolumeId: VolumeId, Key: n.Id, Hashcode: n.Cookie}
}
func NewFileId(VolumeId VolumeId, Key uint64, Hashcode uint32) *FileId {
	return &FileId{VolumeId: VolumeId, Key: Key, Hashcode: Hashcode}
}
func ParseFileId(fid string) (*FileId, error) {
	a := strings.Split(fid, ",")
	if len(a) != 2 {
		glog.V(1).Infoln("Invalid fid ", fid, ", split length ", len(a))
		return nil, errors.New("Invalid fid " + fid)
	}
	vid_string, key_hash_string := a[0], a[1]
	volumeId, _ := NewVolumeId(vid_string)
	key, hash, e := ParseKeyHash(key_hash_string)
	return &FileId{VolumeId: volumeId, Key: key, Hashcode: hash}, e
}
func (n *FileId) String() string {
	bytes := make([]byte, 12)
	binary.BigEndian.PutUint64(bytes[0:8], n.Key)
	binary.BigEndian.PutUint32(bytes[8:12], n.Hashcode)
	nonzero_index := 0
	for ; bytes[nonzero_index] == 0; nonzero_index++ {
	}
	return n.VolumeId.String() + "," + hex.EncodeToString(bytes[nonzero_index:])
}