namespace YooAsset
{
    public class AssetInfo
    {
        private readonly PackageAsset _packageAsset;
        private string _providerGUID;
        /// 
        /// 所属包裹
        /// 
        public string PackageName { private set; get; }
        /// 
        /// 资源类型
        /// 
        public System.Type AssetType { private set; get; }
        /// 
        /// 错误信息
        /// 
        public string Error { private set; get; }
        /// 
        /// 唯一标识符
        /// 
        internal string GUID
        {
            get
            {
                if (string.IsNullOrEmpty(_providerGUID) == false)
                    return _providerGUID;
                if (AssetType == null)
                    _providerGUID = $"[{AssetPath}][null]";
                else
                    _providerGUID = $"[{AssetPath}][{AssetType.Name}]";
                return _providerGUID;
            }
        }
        /// 
        /// 身份是否无效
        /// 
        internal bool IsInvalid
        {
            get
            {
                return _packageAsset == null;
            }
        }
        /// 
        /// 可寻址地址
        /// 
        public string Address
        {
            get
            {
                if (_packageAsset == null)
                    return string.Empty;
                return _packageAsset.Address;
            }
        }
        /// 
        /// 资源路径
        /// 
        public string AssetPath
        {
            get
            {
                if (_packageAsset == null)
                    return string.Empty;
                return _packageAsset.AssetPath;
            }
        }
        private AssetInfo()
        {
            // 注意:禁止从外部创建该类
        }
        internal AssetInfo(string packageName, PackageAsset packageAsset, System.Type assetType)
        {
            if (packageAsset == null)
                throw new System.Exception("Should never get here !");
            _providerGUID = string.Empty;
            _packageAsset = packageAsset;
            PackageName = packageName;
            AssetType = assetType;
            Error = string.Empty;
        }
        internal AssetInfo(string packageName, string error)
        {
            _providerGUID = string.Empty;
            _packageAsset = null;
            PackageName = packageName;
            AssetType = null;
            Error = error;
        }
    }
}