using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using ReactiveUI;
using Wabbajack.Common;

namespace Wabbajack
{
    public class PercentToDoubleConverter : IBindingTypeConverter
    {
        public int GetAffinityForObjects(Type fromType, Type toType)
        {
            if (toType == typeof(double)) return 1;
            if (toType == typeof(double?)) return 1;
            if (toType == typeof(Percent)) return 1;
            if (toType == typeof(Percent?)) return 1;
            return 0;
        }

        public bool TryConvert(object from, Type toType, object conversionHint, out object result)
        {
            if (toType == typeof(double))
            {
                if (from is Percent p)
                {
                    result = p.Value;
                    return true;
                }
                result = 0d;
                return false;
            }
            if (toType == typeof(double?))
            {
                if (from is Percent p)
                {
                    result = p.Value;
                    return true;
                }
                if (from == null)
                {
                    result = default(double?);
                    return true;
                }
                result = default(double?);
                return false;
            }
            if (toType == typeof(Percent))
            {
                if (from is double d)
                {
                    result = Percent.FactoryPutInRange(d);
                    return true;
                }
                result = Percent.Zero;
                return false;
            }
            if (toType == typeof(Percent?))
            {
                if (from is double d)
                {
                    result = Percent.FactoryPutInRange(d);
                    return true;
                }
                if (from == null)
                {
                    result = default(Percent?);
                    return true;
                }
                result = Percent.Zero;
                return false;
            }

            result = null;
            return false;
        }
    }
}