using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Globalization;
using System.Resources;


namespace EduNetworkBuilder
{
    public partial class IPAddressEntry : Form
    {
        NB_IPAddress WhatToEdit;
        NB_IPAddress DHCPInterface=null;
        bool WellDone = true;
        NetworkDevice ParentDevice = null;
        Point StartLocation = new Point (50,50);


        public IPAddressEntry(NB_IPAddress toEdit, NetworkDevice ToEdit, Form ParentForm, bool JustPinging=false)
        {
            InitializeComponent();
            LanguagifyComponents();
            if(ParentForm != null)
            {
                Point NewPoint = new Point(ParentForm.Location.X + (ParentForm.Width / 2), ParentForm.Location.Y + (ParentForm.Height / 2));
                StartLocation = NewPoint;
            }
            ParentDevice = ToEdit;
            Network myNet = NB.GetNetwork();
            NB_IPAddress lastIP = myNet.RetrieveLastIP();
            WhatToEdit = toEdit;
            string hostname = "";
            if (ToEdit != null)
                hostname = ToEdit.hostname;
            if (toEdit.GetIP.ToIpString() == NB.ZeroIPString)
            {
                string lIP = lastIP.GetIP.ToIpString();
                string lNM = lastIP.GetMask.ToIpString();
                string lGW = lastIP.GetGateway.ToIpString();
                switch (WhatToEdit.GetAddressType)
                {
                    case IPAddressType.gw:
                        lNM = NB.ZeroIPString;
                        lGW = NB.ZeroIPString;
                        break;
                    case IPAddressType.ip:
                    case IPAddressType.ip_only:
                        if (!lNM.Contains("255"))
                            lNM = "255.255.255.0";
                        lGW = NB.ZeroIPString;
                        break;
                    case IPAddressType.route:
                        break;
                }
                WhatToEdit.Reparse(lIP, lNM, lGW);
            }
            UpdateFieldsFromAddress();
            switch (WhatToEdit.GetAddressType)
            {
                case IPAddressType.gw:
                    tbGateway.Enabled = false;
                    tbGateway.Visible = false; //This just confuses people
                    tbIPAddress.Enabled = true;
                    tbNetmask.Enabled = false;
                    lblGateway.Visible = false;
                    break;
                case IPAddressType.ip:
                    tbGateway.Enabled = false;
                    tbIPAddress.Enabled = true;
                    tbNetmask.Enabled = true;
                    break;
                case IPAddressType.route:
                    tbGateway.Enabled = true;
                    tbIPAddress.Enabled = true;
                    tbNetmask.Enabled = true;
                    break;
                case IPAddressType.ip_only:
                    tbGateway.Enabled = false;
                    tbIPAddress.Enabled = true;
                    tbNetmask.Enabled = false;
                    break;
            }

            //Disable anythingthatis locked
            switch (WhatToEdit.GetAddressType)
            {
                case IPAddressType.gw:
                    if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockGateway))
                    {
                        tbGateway.Enabled = false;
                        tbIPAddress.Enabled = false;
                        tbNetmask.Enabled = false;
                    }
                    break;
                case IPAddressType.ip:
                    if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockIP))
                    {
                        tbGateway.Enabled = false;
                        tbIPAddress.Enabled = false;
                        tbNetmask.Enabled = false;
                    }
                    break;
                case IPAddressType.route:
                    if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockRoute))
                    {
                        tbGateway.Enabled = false;
                        tbIPAddress.Enabled = false;
                        tbNetmask.Enabled = false;
                    }
                    break;
                case IPAddressType.ip_only:
                    if (!JustPinging && myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockIP))
                    {
                        tbIPAddress.Enabled = false;
                    }
                    break;
            }
        }

        private void LanguagifyComponents()
        {
            //ResourceManager RM = NB.GetResource();
            //CultureInfo CI = NB.GetCulture();
            Text = NB.Translate("IPAE_lblIP");
            Text = NB.Translate("IPAE_lblNetmask");
            Text = NB.Translate("IPAE_lblGateway");
            Text = NB.Translate("_Cancel");
            Text = NB.Translate("_OK");
            Text = NB.Translate("IPAE_Form");
        }
 

        private void UpdateFieldsFromAddress()
        {
            tbIPAddress.Text = WhatToEdit.GetIP.ToIpString();
            tbNetmask.Text = WhatToEdit.GetMask.ToIpString();
            tbGateway.Text = WhatToEdit.GetGateway.ToIpString();
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            WhatToEdit.Reparse(tbIPAddress.Text, tbNetmask.Text, tbGateway.Text);
            Network myNet = NB.GetNetwork();
            myNet.StoreLastIP(WhatToEdit);
            Close();
        }

        public bool Edit()
        {
            Location = StartLocation;
            ShowDialog();
            return WellDone;
        }

        public bool Edit(NetworkDevice ToEdit, NB_IPAddress DHCPif)
        {
            DHCPInterface = DHCPif;
            lblIP.Text = NB.Translate("IPAE_EditIf");
            lblNetmask.Text = NB.Translate("IPAE_EditStart");
            lblGateway.Text = NB.Translate("IPAE_EditEnd");
            tbIPAddress.Enabled = false;
            tbGateway.Enabled = true;
            tbNetmask.Enabled = true;
            Network myNet = NB.GetNetwork(); 
            if (myNet.ItemIsLocked(ToEdit.hostname, tbIPAddress.Text, NetTestType.LockDHCP))
            {
                tbGateway.Enabled = false;
                tbIPAddress.Enabled = false;
                tbNetmask.Enabled = false;
            }
            Location = StartLocation;
            ShowDialog();
            return WellDone;
        }


        private void btnCancel_Click(object sender, EventArgs e)
        {
            UpdateFieldsFromAddress();
            WellDone = false;
            Close();
        }

        private void tbGateway_Validating(object sender, CancelEventArgs e)
        {
            Network mynet = NB.GetNetwork();
            if (ParentDevice != null)
            {
                NB_IPAddress tAddress = mynet.DNSLookup(ParentDevice, tbGateway.Text);
            }

            UInt32 taddress = tbGateway.Text.ParseIp();
            UInt32 startaddress = tbNetmask.Text.ParseIp();
            tbGateway.Text = taddress.ToIpString();
            if (DHCPInterface != null)
            { 
                //We also check to verify that the address is in the correct range
                if (!DHCPInterface.IsLocal(new NB_IPAddress(tbGateway.Text)))
                {
                    e.Cancel = true;
                    MessageBox.Show(NB.Translate("IPAE_tbGateValEndIPRange"));
                }
                if (taddress < startaddress)
                {
                    e.Cancel = true;
                    MessageBox.Show(NB.Translate("IPAE_tbGateValIPEqualLarger"));
                }
            }
        }

        private void tbNetmask_Validating(object sender, CancelEventArgs e)
        {
            UInt32 taddress = tbNetmask.Text.ParseIp();
            tbNetmask.Text = taddress.ToIpString();
            if (DHCPInterface != null)
            {
                //We also check to verify that the address is in the correct range
                if (!DHCPInterface.IsLocal(new NB_IPAddress(tbNetmask.Text)))
                {
                    e.Cancel = true;
                    MessageBox.Show(NB.Translate("IPAE_tbNtmskValEndIPRange"));
                }
            }
        }

        private void tbIPAddress_Validating(object sender, CancelEventArgs e)
        {
            UInt32 taddress;
            Network mynet = NB.GetNetwork();
            NB_IPAddress tIPAddress = null;
            if (ParentDevice != null)
            {
                tIPAddress = mynet.DNSLookup(ParentDevice, tbIPAddress.Text);                    
            }
            if(tIPAddress != null)
            {
                taddress = tIPAddress.GetIP;
            }
            else
                taddress = tbIPAddress.Text.ParseIp();
            tbIPAddress.Text = taddress.ToIpString();
        }

        public void SetText(string text)
        {
            this.Text = text;
        }

        private void IPAddressEntry_Shown(object sender, EventArgs e)
        {
            Point tLocation = new Point (StartLocation.X - Width, StartLocation.Y - Height);
            if (tLocation.X < 0 || tLocation.Y < 0) tLocation = new Point(50, 50);
            Location = tLocation;
        }
    }
}
