package cid

import (
	mh 
)

type Builder interface {
	Sum(data []byte) (Cid, error)
	GetCodec() uint64
	WithCodec(uint64) Builder
}

type V0Builder struct{}

type V1Builder struct {
	Codec    uint64
	MhType   uint64
	MhLength int // MhLength <= 0 means the default length
}

func ( Prefix) () uint64 {
	return .Codec
}

func ( Prefix) ( uint64) Builder {
	if  == .Codec {
		return 
	}
	.Codec = 
	if  != DagProtobuf {
		.Version = 1
	}
	return 
}

func ( V0Builder) ( []byte) (Cid, error) {
	,  := mh.Sum(, mh.SHA2_256, -1)
	if  != nil {
		return Undef, 
	}
	return Cid{string()}, nil
}

func ( V0Builder) () uint64 {
	return DagProtobuf
}

func ( V0Builder) ( uint64) Builder {
	if  == DagProtobuf {
		return 
	}
	return V1Builder{Codec: , MhType: mh.SHA2_256}
}

func ( V1Builder) ( []byte) (Cid, error) {
	 := .MhLength
	if  <= 0 {
		 = -1
	}
	,  := mh.Sum(, .MhType, )
	if  != nil {
		return Undef, 
	}
	return NewCidV1(.Codec, ), nil
}

func ( V1Builder) () uint64 {
	return .Codec
}

func ( V1Builder) ( uint64) Builder {
	.Codec = 
	return 
}