/*-------------------------------------------------------------------------
 * 功能描述：ParseCore
 * 作者：xulisong
 * 创建时间： 2019/6/13 18:03:03
 * 版本号：v1.0
 *  -------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using JBIM;
using JBIM.Component;
using JBIM.Definition;
using RevitExport;
using RevitExport.Export;
using RevitToJBim.Common;
using RevitToJBim.ParseData;
using SAGA.RevitUtils.Extends;
using JConnector = JBIM.Component.Connector;

namespace RevitToJBim.ComponentParse
{
    /*
     * 核心解析类不解析关系
     */
    /// <summary>
    /// 核心解析类
    /// </summary>
    public class ParseCore
    {
       //获取可用的解析类
       public static List<ParseBase> GetUseParsers()
            {
                List<ParseBase> result = new List<ParseBase>();
                Assembly assembly = Assembly.GetCallingAssembly();
                Type[] types = assembly.GetTypes();
                foreach (var type in types)
                {
                    if (typeof(ParseBase).IsAssignableFrom (type))
                    {
                        if (type.IsAbstract || type.IsGenericTypeDefinition)
                            continue;
                        var attribute = type.GetCustomAttribute<UsableParseAttribute>();
                        if (attribute == null)
                            continue;
                        var construstor = type.GetConstructor(Type.EmptyTypes);
                        if (construstor == null)
                            continue;
                        if (construstor.Invoke(null) is ParseBase parse)
                            result.Add(parse);

                    }
                }

                return result;

            }
     
        public static void AttachObject(ComponentObject bimObj, ElementWrapper wrapper)
        {
            bimObj.SourceId = wrapper.SourceId;
            bimObj.Name = wrapper.RefElement?.Name;
        }
        public static JConnector CreateConnector(Autodesk.Revit.DB.Connector connector)
        {
            var result= new JConnector();
            result.SourceId = RevitIdGenerator.GetConnectorId(connector);
            switch (connector.Domain)
            {
                case Domain.DomainHvac:
                {
                    result.Domain = ConnectorDomain.DomainHvac.ToString();
                    break;
                }
                case Domain.DomainPiping:
                {
                    result.Domain = ConnectorDomain.DomainPiping.ToString();
                    break;
                }
            }
            result.IsConnected = connector.IsConnected;
            result.Description = connector.Description;
            result.Origin = BimConvert.ConvertToXYZ(connector.Origin);
            return result;
        }
        /// <summary>
        /// 获取Connector包装类
        /// </summary>
        /// <param name="connector"></param>
        /// <returns></returns>
        public static ElementWrapper GetConnectorWrapper(Autodesk.Revit.DB.Connector connector)
        {
            ElementWrapper wrapper = new ElementWrapper(connector, RevitIdGenerator.GetConnectorId(connector));
            return wrapper;
        }

        /// <summary>
        /// 获取元素关联的connector关联信息，若connector数量为0，则返回null
        /// </summary>
        /// <param name="element"></param>
        /// <param name="connectors"></param>
        /// <returns></returns>
        public static ElementOneToManyRel GetConnectorRels(Element element,List<Autodesk.Revit.DB.Connector> connectors)
        {
            ElementOneToManyRel relMany = new ElementOneToManyRel(element.Id.ToString()) { RelatedObjects = new List<string>() };
            relMany.SetElementType(TypeDefinition.Property_ConnectedIds);
            foreach (var refConnector in connectors)
            {
                relMany.RelatedObjects.Add(RevitIdGenerator.GetConnectorId(refConnector));
            }

            if (relMany.RelatedObjects.Any())
            {
                return relMany;
            }
            return null;//创建关系无效
        }
        /// <summary>
        /// 解析定位信息
        /// </summary>
        /// <param name="location"></param>
        /// <returns></returns>
        public static GeometryLocation GetLocation(Location location)
        {
            if (location == null)
                return null;
            if (location is LocationPoint point)
            {
                var usePoint = point.Point;
                return GeometryLocation.CreatePointLocation(BimConvert.ConvertToXYZ(usePoint));
            }
            else if (location is LocationCurve curve)
            {
                var points = curve.Curve.GetPoints();
                if (curve.Curve is Line)
                    return GeometryLocation.CreateLineLocation(BimConvert.ConvertToXYZs(points));
                else if (curve.Curve is Arc)
                    return GeometryLocation.CreateArcLocation(BimConvert.ConvertToXYZs(points));
            }

            return null;
        }
    }
}
