using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using UnityEngine;
using UnityEngine.UIElements;

namespace AV.UITK
{
    public partial class FluentElement<T>
    {
        public bool Has<TType>() where TType : VisualElement
        {
            return Get<TType>() != null;
        }
        public bool Has<TType>(string nameOrClass) where TType : VisualElement
        {
            return Get<TType>(nameOrClass).First() != null;
        }
        public bool Has(string nameOrClass)
        {
            return Get(nameOrClass).First() != null;
        }

        public bool Has<TType>(out TType e) where TType : VisualElement
        {
            e = Get<TType>(); return e != null;
        }
        public bool Has<TType>(string nameOrClass, out TType e) where TType : VisualElement
        {
            e = Get<TType>(nameOrClass); return e != null;
        }
        public bool Has(string nameOrClass, out VisualElement e)
        {
            e = Get(nameOrClass); return e != null;
        }
        
        
        // TODO: UQueryBuilder wrapper?
        
        public UQueryBuilder<TType> Get<TType>() where TType : VisualElement
        {
            return x.Query<TType>();
        }
        public UQueryBuilder<VisualElement> Get(string nameOrClass)
        {
            return Get<VisualElement>(nameOrClass);
        }
        public UQueryBuilder<TType> Get<TType>(string nameOrClass) where TType : VisualElement
        {
            if (nameOrClass.StartsWith(".")) return x.Query<TType>(className: nameOrClass.TrimStart('.'));
            if (nameOrClass.StartsWith("#")) return x.Query<TType>(name: nameOrClass.TrimStart('#'));
            return x.Query<TType>(nameOrClass);
        }
    }
}