using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModuleDataLib;

namespace Setup
{
    /// <summary>
    /// Bázová třída pro řídící panely
    /// </summary>
    public partial class CtrlPanel : UserControl
    {
        /// <summary>
        /// Odkaz na instanci objektu datové komunikace
        /// </summary>
        public DataBase DataObject { get; set; }

        /// <summary>
        /// Zajistí stažení dat z modulu
        /// </summary>
        public virtual void DownloadData()
        {

            (this.TopLevelControl as Form1).SetStatusComm();

            DialogResult r = DialogResult.Retry;

            while (r == DialogResult.Retry)
            {
                try
                {
                    if (DataObject.Get())
                    {
                        (this.TopLevelControl as Form1).SetStatus();
                        return;
                    }
                }
                catch (Exception e)
                {
                    r = MessageBox.Show(
                        String.Format(
                            "Došlo k chybě komunikace s modulem:{0}{1}",
                            Environment.NewLine,
                            e.Message),
                        "Komunikační chyba",
                        MessageBoxButtons.RetryCancel,
                        MessageBoxIcon.Error);
                }
            }
            (this.TopLevelControl as Form1).SetStatusErr();
            UseWaitCursor = false;
        }

        /// <summary>
        /// Provede stažení dat v případě, že dosud nebylo provedeno
        /// </summary>
        public virtual void ShowData()
        {
            if (DataObject == null)
                return;
            if (!DataObject.Retrieved)
                DownloadData();
        }
        
        /// <summary>
        /// Validace dat zadaných uživatelem ve formuláři
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public virtual bool ValidateData(StringBuilder message)
        {
            // vlastní validace je implementována v potomcích,
            // zde je pouze zobrazen výsledek

            if (String.IsNullOrEmpty(message.ToString()))
                return true;

            MessageBox.Show(
                message.ToString(),
                "Nesprávné zadání",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

        /// <summary>
        /// Uložení dat do modulu
        /// </summary>
        public virtual bool UploadData()
        {
            DialogResult r = DialogResult.Retry;
            while (r == DialogResult.Retry)
            {
                try
                {
                    if (DataObject.Upload())
                    {
                        MessageBox.Show(
                            "Nastavení bylo úspěšně přeneseno do modulu",
                            "Potvrzení",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return true;
                    }
                }
                catch (Exception e)
                {

                    r = MessageBox.Show(
                        String.Format(
                            "Došlo k chybě komunikace s modulem:{0}{1}",
                            Environment.NewLine,
                            e.Message),
                        "Komunikační chyba",
                        MessageBoxButtons.RetryCancel,
                        MessageBoxIcon.Error);
                }
            }
            return false;
        }

        /// <summary>
        /// Vytvoří instanci
        /// </summary>
        public CtrlPanel()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Obsluha tlačítka NASTAVIT (načtení z modulu)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGet_Click(object sender, EventArgs e)
        {
            DownloadData();
            ShowData();
        }

        /// <summary>
        /// Obsluha tlačítka AKTUALIZOVAT (uložení do modulu)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSet_Click(object sender, EventArgs e)
        {
            if (ValidateData(null))
            {
                if (MessageBox.Show(
                    "Opravdu chcete přenést do modulu nové nastavení?",
                    "Potvrzení",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    UploadData();
                }
            }
        }

        /// <summary>
        /// Obsluha události změny viditelnosti panelu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataPanel_VisibleChanged(object sender, EventArgs e)
        {
            if (this.Visible)
                // v případě zviditelnění, jsou data zobrazena, případně i stažena
                ShowData();
        }
    }
}
