// Copyright 2013 The Servo Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

//! Core Foundation UUID objects.

#[cfg(feature = "with-uuid")]
extern crate uuid;

pub use core_foundation_sys::uuid::*;
use core_foundation_sys::base::kCFAllocatorDefault;

use base::TCFType;

#[cfg(feature = "with-uuid")]
use self::uuid::Uuid;


declare_TCFType! {
    /// A UUID.
    CFUUID, CFUUIDRef
}
impl_TCFType!(CFUUID, CFUUIDRef, CFUUIDGetTypeID);
impl_CFTypeDescription!(CFUUID);

impl CFUUID {
    #[inline]
    pub fn new() -> CFUUID {
        unsafe {
            let uuid_ref = CFUUIDCreate(kCFAllocatorDefault);
            TCFType::wrap_under_create_rule(uuid_ref)
        }
    }
}

#[cfg(feature = "with-uuid")]
impl Into<Uuid> for CFUUID {
    fn into(self) -> Uuid {
        let b = unsafe {
            CFUUIDGetUUIDBytes(self.0)
        };
        let bytes = [
            b.byte0,
            b.byte1,
            b.byte2,
            b.byte3,
            b.byte4,
            b.byte5,
            b.byte6,
            b.byte7,
            b.byte8,
            b.byte9,
            b.byte10,
            b.byte11,
            b.byte12,
            b.byte13,
            b.byte14,
            b.byte15,
        ];
        Uuid::from_bytes(&bytes).unwrap()
    }
}

#[cfg(feature = "with-uuid")]
impl From<Uuid> for CFUUID {
    fn from(uuid: Uuid) -> CFUUID {
        let b = uuid.as_bytes();
        let bytes = CFUUIDBytes {
            byte0: b[0],
            byte1: b[1],
            byte2: b[2],
            byte3: b[3],
            byte4: b[4],
            byte5: b[5],
            byte6: b[6],
            byte7: b[7],
            byte8: b[8],
            byte9: b[9],
            byte10: b[10],
            byte11: b[11],
            byte12: b[12],
            byte13: b[13],
            byte14: b[14],
            byte15: b[15],
        };
        unsafe {
            let uuid_ref = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, bytes);
            TCFType::wrap_under_create_rule(uuid_ref)
        }
    }
}


#[cfg(test)]
#[cfg(feature = "with-uuid")]
mod test {
    use super::CFUUID;
    use uuid::Uuid;

    #[test]
    fn uuid_conversion() {
        let cf_uuid = CFUUID::new();
        let uuid: Uuid = cf_uuid.clone().into();
        let converted = CFUUID::from(uuid);
        assert!(cf_uuid == converted);
    }
}
