using System;
using System.Collections;

using BS.Shared.Extensions;
using Config;

namespace ValidationLibrary
{
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
    public class ValidationAttribute : Attribute
    {
        public ValidationAttribute()
        {
            ValidationRule = ValidationRules.AlwaysValid;
        }

        public ValidationRules ValidationRule { get; set; }

        public bool Validate(object pValue)
        {
            var lResult = true;
            switch (ValidationRule)
            {
                case ValidationRules.NotZero:
                    double lNumber;
                    var lIsNumber = Double.TryParse(pValue.ToStringNullCheck(), out lNumber);
                    if (lIsNumber)
                        lResult = !Equals(lNumber, 0d);

                    break;
                case ValidationRules.GreaterThanZero:
                    if (pValue == null)
                    {
                        lResult = false;
                    }
                    else
                    {
                        double lNumber2;
                        var lIsNumber2 = Double.TryParse(pValue.ToStringNullCheck(), out lNumber2);
                        if (lIsNumber2)
                            lResult = lNumber2 > 0d;
                    }

                    break;
                case ValidationRules.GreaterThanOrEqualZero:
                    if (pValue == null)
                    {
                        lResult = false;
                    }
                    else
                    {
                        double lNumber3;
                        bool lIsNumber3 = Double.TryParse(pValue.ToStringNullCheck(), out lNumber3);
                        if (lIsNumber3)
                            lResult = lNumber3 >= 0d;
                    }

                    break;
                case ValidationRules.NotNullOrStringEmpty:
                    lResult = pValue is string ? ((string) pValue).Trim() != string.Empty : pValue != null;

                    break;
                case ValidationRules.EmptyNoticeInNewServiceRecordsAllowed:
                    if (AppSettings.mIsServiceRecordNoticeMandatory)
                    {
                        lResult = pValue is string ? ((string) pValue).Trim() != string.Empty : pValue != null;
                    }

                    break;
                case ValidationRules.CollectionNotEmpty:
                    if (pValue is ICollection)
                        lResult = (pValue as ICollection).Count > 0;

                    break;
            }

            return lResult;
        }
    }
}