using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using WGneu.Models;


namespace WGneu.Windows
{
    /// <summary>
    /// Interaktionslogik für BankDetailsWindow.xaml
    /// </summary>
    public partial class BankDetailsWindow : Window
    {
        public BankDetailsWindow()
        {
            InitializeComponent();
        }

        private void Iban_TextChanged(object sender, TextChangedEventArgs e)
        {
            string iban = "";
            int pos = Iban.CaretIndex;
            for (int i = 0, v = 0; i < Iban.Text.Length && v < 34; i++)
            {
                char ch = Iban.Text[i];
                if (Char.IsLetterOrDigit(ch) && Char.IsAscii(ch))
                {
                    if (v != 0 && v % 4 == 0)
                        iban += ' ';
                    v++;
                    iban += Char.ToUpper(ch);
                }
                if (i == Iban.CaretIndex - 1)
                    pos = iban.Length;
                if (iban.StartsWith("AT") && v >= 20)
                    break;
            }
            Iban.Text = iban;
            Iban.CaretIndex = pos;

            if (Iban.IsFocused)
                GenerateBankDetails();
        }

        private void Iban_LostFocus(object sender, EventArgs e)
        {
            // TODO vaildate checksum
        }

        private void BankCode_TextChanged(object sender, TextChangedEventArgs e)
        {
            string cc = "AT";
            string code = "";
            int pos = BankCode.CaretIndex;

            if (cc == "AT")
            {

                for (int i = 0, v = 0; i < BankCode.Text.Length && v < 5; i++)
                {
                    char ch = BankCode.Text[i];
                    if (Char.IsDigit(ch))
                    {
                        v++;
                        code += ch;
                    }
                    if (i == BankCode.CaretIndex - 1)
                        pos = code.Length;
                }
            }

            BankCode.Text = code;
            BankCode.CaretIndex = pos;

            if (BankCode.IsFocused)
                GenerateIban();
        }

        private void AccountNumber_TextChanged(object sender, TextChangedEventArgs e)
        {
            string cc = "AT";
            string num = "";
            int pos = AccountNumber.CaretIndex;

            if (cc == "AT")
            {
                for (int i = 0, v = 0; i < AccountNumber.Text.Length && v < 11; i++)
                {
                    char ch = AccountNumber.Text[i];
                    if (Char.IsLetterOrDigit(ch) && Char.IsAscii(ch))
                    {
                        v++;
                        num += ch;
                    }
                    if (i == AccountNumber.CaretIndex - 1)
                        pos = num.Length;
                }
            }

            AccountNumber.Text = num;
            AccountNumber.CaretIndex = pos;

            if (AccountNumber.IsFocused)
                GenerateIban();
        }

        private void GenerateIban()
        {
            string cc = "AT";
            string iban = cc + "00";

            if (cc == "AT")
            {
                iban += BankCode.Text.PadLeft(5, '0') + AccountNumber.Text.PadLeft(11, '0');
            }

            // TODO calculate checksum

            Iban.Text = iban;
            Iban.CaretIndex = iban.Length;
        }

        private void GenerateBankDetails()
        {
            BankCode.Text = "";
            AccountNumber.Text = "";

            string iban = Iban.Text.Replace(" ", "");
            if (iban.Length <= 2)
                return;

            string cc = iban.Substring(0, 2);
            if (cc == "AT")
            {
                if (iban.Length > 4)
                {
                    string bankCodeStr = iban.Substring(4, Math.Min(5, iban.Length - 4));
                    if (bankCodeStr.All(Char.IsDigit))
                    {
                        int bankCode = int.Parse(bankCodeStr);
                        BankCode.Text = bankCode.ToString();
                    }
                    if (iban.Length > 9)
                    {
                        string accNumStr = iban.Substring(9, Math.Min(11, iban.Length - 9));
                        if (accNumStr.All(Char.IsDigit))
                        {
                            int accNum = int.Parse(accNumStr);
                            AccountNumber.Text = (accNum != 0) ? accNum.ToString() : "";
                        }
                        else
                        {
                            AccountNumber.Text = accNumStr;
                        }
                    }
                }
            }

            BankCode.CaretIndex = BankCode.Text.Length;
            AccountNumber.CaretIndex = AccountNumber.Text.Length;
        }
    }
}