using System;
using System.Data;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Web;
using AlfredoLotar.Livro.Aspnet.Model;

public partial class FormSeguro : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //Não armazena a página no cache.
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetAllowResponseInBrowserHistory(false);
    }

    protected void btnEnviar_Click(object sender, EventArgs e)
    {
        if (Enviar())
        {
            Label1.Text = "Ok.";
            Label1.ForeColor = Color.Blue;
            Limpar();
        }
        else
        {
            Label1.Text = "Erro ao enviar informações.";
            Label1.ForeColor = Color.Red;
        }
    }

    /// <summary>
    /// Limpa os campos do formulário.
    /// </summary>
    private void Limpar()
    {
        txtNome.Text = string.Empty;
        txtPreco.Text = string.Empty;
        txtUnidadeEstoque.Text = string.Empty;
    }

    /// <summary>
    /// Processa o envio das informações para o banco de dados.
    /// </summary>
    /// <returns></returns>
    private bool Enviar()
    {
        Decimal resultado;
        short saida;
        bool chk;
        Label1.Text = string.Empty;

        if (!string.IsNullOrWhiteSpace(txtNome.Text.Trim()) &&
            !string.IsNullOrWhiteSpace(txtPreco.Text.Trim()) &&
            !string.IsNullOrWhiteSpace(txtUnidadeEstoque.Text.Trim()))
        {
            if (!Regex.IsMatch(txtNome.Text.Trim(), @"^[0-9a-zA-Z_\s\.\-’äëöüáéíóúâêôàçãõ]{1,40}$")) return false;
            if (!Decimal.TryParse(TiraPonto(txtPreco.Text.Trim()), out resultado)) return false;
            if (!Int16.TryParse(txtUnidadeEstoque.Text.Trim(), out saida)) return false;
            if (!bool.TryParse(rdbSim.Checked.ToString(), out chk)) return false;
            if (!bool.TryParse(rdbNao.Checked.ToString(), out chk)) return false;

            using (northwindEntities db = new northwindEntities())
            {
                try
                {
                    Produtos p = new Produtos();
                    p.ProductName = txtNome.Text.Trim();
                    p.UnitPrice = resultado;
                    p.UnitsInStock = saida;
                    p.Discontinued = rdbSim.Checked;
                    db.AddToProdutos(p);
                    db.SaveChanges();
                    return true;
                }
                catch (EntitySqlException)
                {
                    return false;
                }
                catch (EntityCommandExecutionException)
                {
                    return false;
                }
            }
        }
        else
        {
            Label1.Text = "Preencha todos os campos do formulário.";
            Label1.ForeColor = Color.Red;
            return false;
        }
    }

    /// <summary>
    /// Substitui um ponto inserido pelo usuário por uma virgula.
    /// </summary>
    /// <param name="valor"></param>
    /// <returns></returns>
    private string TiraPonto(string valor)
    {
        if (string.IsNullOrWhiteSpace(valor)) throw new ArgumentNullException("Valor não pode ser nulo.");
        bool b = false;
        string texto = string.Empty;
        for (int i = 0; i < valor.Length; i++)
        {
            if (valor.Substring(i, 1) == "." || valor.Substring(i, 1) == ",")
            {
                if (b)
                {
                    texto += string.Empty;
                }
                else
                {
                    texto += ",";
                    b = true;
                }
            }
            else
            {
                texto += valor.Substring(i, 1);
            }
        }
        return texto;       
    }
}