using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Threading.Tasks;

namespace SourceGit.ViewModels
{
    public class AddSubmodule : Popup
    {
        [Required(ErrorMessage = "Url is required!!!")]
        [CustomValidation(typeof(AddSubmodule), nameof(ValidateURL))]
        public string Url
        {
            get => _url;
            set => SetProperty(ref _url, value, true);
        }

        [Required(ErrorMessage = "Reletive path is required!!!")]
        [CustomValidation(typeof(AddSubmodule), nameof(ValidateRelativePath))]
        public string RelativePath
        {
            get => _relativePath;
            set => SetProperty(ref _relativePath, value, true);
        }

        public bool Recursive
        {
            get;
            set;
        }

        public AddSubmodule(Repository repo)
        {
            _repo = repo;
            View = new Views.AddSubmodule() { DataContext = this };
        }

        public static ValidationResult ValidateURL(string url, ValidationContext ctx)
        {
            if (!Models.Remote.IsValidURL(url))
                return new ValidationResult("Invalid repository URL format");
            return ValidationResult.Success;
        }

        public static ValidationResult ValidateRelativePath(string path, ValidationContext ctx)
        {
            if (Path.Exists(path))
            {
                return new ValidationResult("Give path is exists already!");
            }

            if (Path.IsPathRooted(path))
            {
                return new ValidationResult("Path must be relative to this repository!");
            }

            return ValidationResult.Success;
        }

        public override Task<bool> Sure()
        {
            _repo.SetWatcherEnabled(false);
            ProgressDescription = "Adding submodule...";

            return Task.Run(() =>
            {
                var succ = new Commands.Submodule(_repo.FullPath).Add(_url, _relativePath, Recursive, SetProgressDescription);
                CallUIThread(() => _repo.SetWatcherEnabled(true));
                return succ;
            });
        }

        private readonly Repository _repo = null;
        private string _url = string.Empty;
        private string _relativePath = string.Empty;
    }
}
