using SteamWare;
using System;


namespace GMW.WebUserControls
{
  public partial class mod_selPeriodo : System.Web.UI.UserControl
  {
    #region area protected

    protected intervalloDate _intervallo;

    /// <summary>
    /// avvio componente
    /// </summary>
    /// <param name="e"></param>
    protected override void OnInit(EventArgs e)
    {
      base.OnInit(e);
      setIntervallo();
      setDurataMin();
    }
    /// <summary>
    /// definisce se sia da mostrare il selettore delle ore nel controllo
    /// </summary>
    public bool mostraSelOra
    {
      get
      {
        bool answ = false;
        if (memLayer.ML.isInSessionObject("mostraSelOra"))
        {
          answ = memLayer.ML.BoolSessionObj("mostraSelOra");
        }
        else
        {
          // leggo da sessione e salvo...
          try
          {
            answ = memLayer.ML.confReadBool("mostraSelOra");
          }
          catch
          { }
          memLayer.ML.setSessionVal("mostraSelOra", answ);
        }
        return answ;
      }
      set
      {
        memLayer.ML.setSessionVal("mostraSelOra", value);
      }
    }

    /// <summary>
    /// gestione del selettore rapido dell'intervallo temporale...
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void ddlSelPeriodo_SelectedIndexChanged(object sender, EventArgs e)
    {
      // verifico cosa sia cambiato ed imposto date...
      datario _datario = new datario();
      switch (ddlSelPeriodo.SelectedValue)
      {
        case "oggi":
          _intervallo = _datario.giornata(DateTime.Now);
          break;
        case "ieri":
          _intervallo = _datario.giornata(DateTime.Now.AddDays(-1));
          break;
        case "ultimi 7gg":
          _intervallo = _datario.ultimiGiorni(DateTime.Now, 7);
          break;
        case "questa settimana":
          _intervallo = _datario.questaSett(DateTime.Now);
          break;
        case "ultimi 30gg":
          _intervallo = _datario.ultimiGiorni(DateTime.Now, 30);
          break;
        case "questo mese":
          _intervallo = _datario.questoMese(DateTime.Now);
          break;
        case "1 anno":
          _intervallo = _datario.ultimiGiorni(DateTime.Now, 366);
          break;
        default:
          break;
      }
      if ((intervalloAnalisi.inizio != _intervallo.inizio) || (intervalloAnalisi.fine != _intervallo.fine))
      {
        verificaCoerenzaDate();
        aggiornaDateMostrate(false);
        // mostro btn update
        btnUpdate.Visible = true;
      }
    }
    /// <summary>
    /// effettua update delle date mostrate da intervallo analisi (ed eventualmente riporta update...)
    /// </summary>
    /// <param name="doReportUpdate"></param>
    private void aggiornaDateMostrate(bool doReportUpdate)
    {
      scriviDate();
      if (doReportUpdate)
      {
        reportUpdate();
      }
    }
    /// <summary>
    /// scrive nuove date in controllo
    /// </summary>
    private void scriviDate()
    {
      // se intervallo non è valorizzato leggo da sessione...
      if (!_intervallo.isValid)
      {
        _intervallo = intervalloAnalisi;
      }
      txtInizio.Text = _intervallo.inizio.ToShortDateString();
      ddlOraInizio.SelectedValue = _intervallo.inizio.Hour.ToString("00");
      txtFine.Text = _intervallo.fine.ToShortDateString();
      ddlOraFine.SelectedValue = _intervallo.fine.Hour.ToString("00");
      if (mostraSelOra)
      {
        ddlOraInizio.Visible = true;
        ddlOraFine.Visible = true;
      }
      else
      {
        ddlOraInizio.Visible = false;
        ddlOraFine.Visible = false;
      }
    }
    /// <summary>
    /// imposta intervallo da sessione o di default
    /// </summary>
    private void setIntervallo()
    {
      intervalloDate _intervallo;
      try
      {
        _intervallo = (intervalloDate)Session["_intervallo"];
        Session["_inizio"] = _intervallo.inizio;
        Session["_fine"] = _intervallo.fine;
      }
      catch
      {
        _intervallo = new intervalloDate();
        _intervallo.inizio = DateTime.Now.AddDays(memLayer.ML.confReadInt("defDayFrom"));
        _intervallo.fine = DateTime.Now.AddDays(1);
        Session["_intervallo"] = _intervallo;
        Session["_inizio"] = _intervallo.inizio;
        Session["_fine"] = _intervallo.fine;
      }
      scriviDate();
    }
    /// <summary>
    /// imposta durata minima
    /// </summary>
    private void setDurataMin()
    {
      int _durataMin;
      try
      {
        _durataMin = (int)Session["_durataMin"];
      }
      catch
      {
        _durataMin = 0;
        Session["_durataMin"] = _durataMin;
      }
      txtDurataMin.Text = _durataMin.ToString();
    }
    /// <summary>
    /// caricamento pagina
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
      lblPeriodo.Text = "Periodo di riferimento: ";
      txtInizio.ToolTip = "inizio periodo di riferimento per i dati mostrati";
      txtFine.ToolTip = "fine periodo di riferimento per i dati mostrati";
      lblDurataMin.Text = "Visualizza eventi con durata superiore a";
    }


    private void aggiornaPeriodo()
    {
      _intervallo = new intervalloDate();
      // calcolo tempi arrotondati
      int oraInizio = Convert.ToInt32(ddlOraInizio.SelectedValue);
      int oraFine = Convert.ToInt32(ddlOraFine.SelectedValue);
      _intervallo.inizio = Convert.ToDateTime(txtInizio.Text).AddHours(oraInizio);
      _intervallo.fine = Convert.ToDateTime(txtFine.Text).AddHours(oraFine);
      verificaCoerenzaDate();
      int _durataMin;
      _durataMin = Convert.ToInt32(txtDurataMin.Text);
      Session["_durataMin"] = _durataMin;
      reportUpdate();

    }
    /// <summary>
    /// verifica che le date dell'intervallo siano coerenti (inizio < fine)
    /// </summary>
    private void verificaCoerenzaDate()
    {
      // controllo date siano coerenti (fine > inizio)...
      if (_intervallo.inizio >= _intervallo.fine)
      {
        // controllo non siano date successive ad oggi...
        if (_intervallo.fine > DateTime.Now)
        {
          _intervallo.fine = DateTime.Now;
        }
        _intervallo.inizio = _intervallo.fine.AddDays(-1);
      }
      //intervalloAnalisi = _intervallo;
      aggiornaDateMostrate(false);
    }
    /// <summary>
    /// evento cambio testo data inizio
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void txtInizio_TextChanged(object sender, EventArgs e)
    {
      // imposto il selettore a discesa...
      setPeriodoFree();
      // mostro btn update
      btnUpdate.Visible = true;
    }
    /// <summary>
    /// evento cambio testo data fine
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void txtFine_TextChanged(object sender, EventArgs e)
    {
      // imposto il selettore a discesa...
      setPeriodoFree();
      // mostro btn update
      btnUpdate.Visible = true;
    }
    /// <summary>
    /// in questo caso faccio udpate periodo mostrato
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnUpdate_Click(object sender, EventArgs e)
    {
      aggiornaPeriodo();
      // nascondo btn update
      btnUpdate.Visible = false;
    }
    /// <summary>
    /// riporta aggiornamento a controller
    /// </summary>
    protected void reportUpdate()
    {
      intervalloAnalisi = _intervallo;
      // alzo l'evento d update/inserimento e ricarico cache...
      if (eh_doUpdate != null)
      {
        eh_doUpdate(this, new EventArgs());
      }
    }

    #endregion

    #region area public

    public intervalloDate intervalloAnalisi
    {
      get
      {
        return (intervalloDate)Session["_intervallo"];
      }
      set
      {
        intervalloDate interv = value;
        Session["_intervallo"] = interv;
        Session["_inizio"] = interv.inizio;
        Session["_fine"] = interv.fine;
        _intervallo = interv;
        aggiornaDateMostrate(false);
      }
    }
    /// <summary>
    /// effettua update
    /// </summary>
    /// <param name="doReportUpdate"></param>
    public void doUpdate(bool doReportUpdate)
    {
      aggiornaDateMostrate(doReportUpdate);
    }
    /// <summary>
    /// imposta periodo libero di selezione
    /// </summary>
    public void setPeriodoFree()
    {
      ddlSelPeriodo.SelectedIndex = 0;
    }
    /// <summary>
    /// imposta editabilità controllo
    /// </summary>
    public bool editEnabled
    {
      get
      {
        return ddlSelPeriodo.Enabled;
      }
      set
      {
        txtInizio.Enabled = value;
        txtFine.Enabled = value;
        ddlOraInizio.Enabled = value;
        ddlOraFine.Enabled = value;
        ddlSelPeriodo.Enabled = value;
      }
    }

    #region gestione eventi

    public event EventHandler eh_doUpdate;

    #endregion


    #endregion
  }
}