/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package java_util

import (
	"fmt"
)

// java.util.UUID
type UUID struct {
	MostSigBits  int64 `hessian:"mostSigBits"`
	LeastSigBits int64 `hessian:"leastSigBits"`
}

func (UUID) JavaClassName() string {
	return "java.util.UUID"
}

//String returns a string object representing this UUID.
//The UUID string representation is as described by this BNF:
//
// UUID                   = <time_low> "-" <time_mid> "-"
//                          <time_high_and_version> "-"
//                          <variant_and_sequence> "-"
//                          <node>
// time_low               = 4*<hexOctet>
// time_mid               = 2*<hexOctet>
// time_high_and_version  = 2*<hexOctet>
// variant_and_sequence   = 2*<hexOctet>
// node                   = 6*<hexOctet>
// hexOctet               = <hexDigit><hexDigit>
// hexDigit               =
//       "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
//       | "a" | "b" | "c" | "d" | "e" | "f"
//       | "A" | "B" | "C" | "D" | "E" | "F"
//
//Returns:
//A string representation of this UUID
func (uuid UUID) String() string {
	uuidStr := fmt.Sprintf("%v-%v-%v-%v-%v",
		uuidDigits(uuid.MostSigBits>>32, 8),
		uuidDigits(uuid.MostSigBits>>16, 4),
		uuidDigits(uuid.MostSigBits, 4),
		uuidDigits(uuid.LeastSigBits>>48, 4),
		uuidDigits(uuid.LeastSigBits, 12),
	)
	return uuidStr
}

// uuidDigits returns arg represented by the specified number of hex digits.
func uuidDigits(arg int64, digits uint) string {
	hi := int64(1) << (digits * 4)
	i := hi | (arg & (hi - 1))
	return fmt.Sprintf("%x", i)[1:]
}
