using System.Collections.Generic;
using System.Threading.Tasks;
using Billing.Languages;
using Billing.Models;
using Billing.Store;
using Billing.Themes;
using Xamarin.Essentials;
using Xamarin.Forms;

namespace Billing
{
    public class App : Application
    {
        public static AppTheme CurrentTheme { get; private set; }
        public static PlatformCulture CurrentCulture { get; private set; }
        public static List<Bill> Bills => bills ??= new List<Bill>();
        public static List<Account> Accounts => accounts ??= new List<Account>();
        public static List<Category> Categories => categories ??= new List<Category>();

        private static List<Bill> bills;
        private static List<Account> accounts;
        private static List<Category> categories;

        public App()
        {
            CurrentCulture = new PlatformCulture();
            InitResources();

            MainPage = new MainShell();
            Shell.Current.GoToAsync("//Settings");
        }

        public static void WriteAccounts() => StoreHelper.WriteAccounts(accounts);

        public static void WriteBills() => StoreHelper.WriteBills(bills);

        public static void WriteCategories() => StoreHelper.WriteCategories(categories);

        protected override void OnStart()
        {
            Helper.Debug($"personal folder: {StoreHelper.PersonalFolder}");
            Helper.Debug($"cache folder: {StoreHelper.CacheFolder}");

            accounts = StoreHelper.GetAccounts();
            categories = StoreHelper.GetCategories();
            bills = StoreHelper.GetBills();

            Shell.Current.GoToAsync("//Bills");
        }

        protected override void OnResume()
        {
            SetTheme(AppInfo.RequestedTheme);
        }

        private void InitResources()
        {
            var theme = AppInfo.RequestedTheme;
            SetTheme(theme, true);
        }

        private void SetTheme(AppTheme theme, bool force = false)
        {
            if (force || theme != CurrentTheme)
            {
                CurrentTheme = theme;
            }
            else
            {
                return;
            }
            Helper.Debug($"application theme: {theme}");

            BaseTheme instance;
            if (theme == AppTheme.Dark)
            {
                instance = Dark.Instance;
            }
            else
            {
                instance = Light.Instance;
            }
            // TODO: status bar
            Resources = instance;
        }
    }
}