using System;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;
using Baza_Reklam.Classes.Helpers;

namespace Baza_Reklam
{
    public partial class AgentAddForm : Form
    {
        readonly ErrorProvider errProvider = new ErrorProvider();

        readonly int agentId;

        public AgentAddForm(int idAgenta, int IdAgencji)
        {
            InitializeComponent();

            aGENCITableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            pLANY_PROWIZJITableAdapter.Connection.ConnectionString = ConnString.getConnString().Value;
            pLANY_PROWIZJITableAdapter.Fill(sLOWNIKDataSet.PLANY_PROWIZJI);
            cbInvoiceProvider.DataSource = InvoiceProviderFactory.GetInvoiceProviders();

            if (idAgenta == 0)
            {
                DataView table = (DataView)aGENCIBindingSource.List;
                DataRowView row = table.AddNew();
                row["id_agencji"] = IdAgencji;
                aGENCIBindingSource.EndEdit();
            }
            else
            {
                aGENCITableAdapter.FillByIdAgenta(sLOWNIKDataSet.AGENCI, idAgenta);
                agentId = idAgenta;
                symbolTextBox1.ReadOnly = true;
                f_ROZTextBox.ReadOnly = true;
            }
        }

        private void ZapiszButton_Click(object sender, EventArgs e)
        {
            if (ValidateChildren())
            {
                aGENCIBindingSource.EndEdit();
                aGENCITableAdapter.Update(sLOWNIKDataSet.AGENCI);
                MessageBox.Show("Zmiany zostały zapisane");
                DialogResult = DialogResult.OK;
            }
        }

        private void AnulujButton_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void imięTextBox_Validating(object sender, CancelEventArgs e)
        {
            IsTextBoxEmpty(imięTextBox, "Imię nie może być puste.", e);
        }

        private void nazwiskoTextBox_Validating(object sender, CancelEventArgs e)
        {
            IsTextBoxEmpty(nazwiskoTextBox, "Nazwisko nie może być puste.", e);
        }

        private void symbolTextBox1_Validating(object sender, CancelEventArgs e)
        {
            if(IsTextBoxEmpty(symbolTextBox1, "Symbol agenta nie może być pusty.", e)) return;
            
            StringBuilder errorMessage = new StringBuilder();
            if (!DbUtils.IsLoginUnique(symbolTextBox1.Text, agentId))
            {
                e.Cancel = true;
                errorMessage.Append("Symbol agenta musi być unikalny.");
            }
            else
                e.Cancel = false;

            errProvider.SetError((Control)sender, errorMessage.ToString());
        }

        private void f_ROZTextBox_Validating(object sender, CancelEventArgs e)
        {
            if (IsTextBoxEmpty(f_ROZTextBox, "Kod agenta nie może być pusty.", e)) return;

            if (f_ROZTextBox.Text.Length != 3)
            {
                e.Cancel = true;
                errProvider.SetError((Control)sender, "Kod powienien mieć 3 znaki.");
                return;
            }
            
            if (!DbUtils.tagAgentaUnikalny(f_ROZTextBox.Text, agentId))
            {
                e.Cancel = true;
                errProvider.SetError((Control)sender, "Kod powienien być unikalny.");
                return;
            }

            errProvider.SetError((Control)sender, "");
        }

        private bool IsTextBoxEmpty(TextBox txt, string message, CancelEventArgs e)
        {

            return ValidationHelper.IsTextBoxEmpty(txt, message, e, errProvider);
        }

        private void cbInvoiceProvider_Validating(object sender, CancelEventArgs e)
        {
            ComboBox cb = (ComboBox) sender;

            StringBuilder errorMessage = new StringBuilder();

            if (cb.SelectedIndex < 0 || cb.SelectedItem == null)
            {
                e.Cancel = true;
                errorMessage.Append("Proszę wybrać typ fakturowania.");
            }
            else
                e.Cancel = false;

            errProvider.SetError((Control)sender, errorMessage.ToString());
        }
    }
}