using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Services;
using BTCPayServer.Validation;
using Microsoft.AspNetCore.Mvc.Rendering;

namespace BTCPayServer.Models.StoreViewModels
{
    public class CheckoutExperienceViewModel
    {
        class Format
        {
            public string Name { get; set; }
            public string Value { get; set; }
        }
        public SelectList CryptoCurrencies { get; set; }
        public SelectList Languages { get; set; }

        [Display(Name = "Default crypto currency on checkout")]
        public string DefaultCryptoCurrency { get; set; }
        [Display(Name = "Default language on checkout")]
        public string DefaultLang { get; set; }
        [Display(Name = "Allow conversion through third party (Shapeshift, Changelly...)")]
        public bool AllowCoinConversion
        {
            get; set;
        }
        [Display(Name = "Do not propose lightning payment if value of the invoice is above...")]
        [MaxLength(20)]
        public string LightningMaxValue { get; set; }

        [Display(Name = "Requires a refund email")]
        public bool RequiresRefundEmail
        {
            get; set;
        }

        [Display(Name = "Do not propose on chain payment if the value of the invoice is below...")]
        [MaxLength(20)]
        public string OnChainMinValue { get; set; }

        [Display(Name = "Link to a custom CSS stylesheet")]
        [Uri]
        public string CustomCSS { get; set; }
        [Display(Name = "Link to a custom logo")]
        [Uri]
        public string CustomLogo { get; set; }

        [Display(Name = "Custom HTML title to display on Checkout page")]
        public string HtmlTitle { get; set; }


        public void SetCryptoCurrencies(ExplorerClientProvider explorerProvider, string defaultCrypto)
        {
            var choices = explorerProvider.GetAll().Select(o => new Format() { Name = o.Item1.CryptoCode, Value = o.Item1.CryptoCode }).ToArray();
            var chosen = choices.FirstOrDefault(f => f.Value == defaultCrypto) ?? choices.FirstOrDefault();
            CryptoCurrencies = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
            DefaultCryptoCurrency = chosen.Name;
        }

        public void SetLanguages(LanguageService langService, string defaultLang)
        {
            defaultLang = defaultLang ?? "en-US";
            var choices = langService.GetLanguages().Select(o => new Format() { Name = o.DisplayName, Value = o.Code }).ToArray();
            var chosen = choices.FirstOrDefault(f => f.Value == defaultLang) ?? choices.FirstOrDefault();
            Languages = new SelectList(choices, nameof(chosen.Value), nameof(chosen.Name), chosen);
            DefaultLang = chosen.Value;
        }
    }
}
