// 
// Copyright 2016 Agencia Estatal de Administración Tibutaria
//
// Licencia con arreglo a la EUPL, Versión 1.1 o -en cuanto
// sean aprobadas por la Comisión Europea- versiones
// posteriores de la EUPL (la «Licencia»);
// Solo podrá usarse esta obra si se respeta la Licencia.
// Puede obtenerse una copia de la Licencia en:
//  
// https://joinup.ec.europa.eu/software/page/eupl
//  
// Salvo cuando lo exija la legislación aplicable o se acuerde
// por escrito, el programa distribuido con arreglo a la
// Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
// DE NINGÚN TIPO, ni expresasni implícitas.
//
// Véase la Licencia en el idioma concreto que rige los permisos y 
// limitaciones que establece la Licencia.
// 

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using ateneo.utiles;

namespace ateneo
{
    class ConfiguracionBase
    {
        protected List<Dato> data;
        string nombreFichero;

        public ConfiguracionBase() {
            data = new List<Dato>();
        }
        
        public bool cargar(string fichero) {
            nombreFichero = fichero;
            try {
                using(StreamReader sr = new StreamReader(fichero, Encoding.Default)) {
                    string linea;
                    while ((linea = sr.ReadLine()) != null) {
                        add(linea);
                    }
                }
                return true;
            } catch (Exception exc) {
                LogExcepcion.guardar("Error al cargar fichero de configuracion", exc);
                return false;
            }
        }

        void add(string linea) {
            linea = linea.Trim();
            // guardar linea vacias y comentarios
            if (linea.Length == 0 || linea.StartsWith("#")) {
                Dato dato = new Dato("##", linea);
                data.Add(dato);
                return;
            }
            // procesar las demas lineas, sobreescribiendo las repetidas
            string[] pp = linea.Split('=');
            string clave = pp[0].Trim();
            string valor = "";
            if (pp.Length > 1) {
                valor = pp[1].Trim();
            }
            ponValor(clave, valor);
        }

        protected void ponValor(string clave, string valor) {
            Dato dato = buscar(clave);
            if (dato == null) {
                dato = new Dato(clave, valor);
                data.Add(dato);
            } else {
                dato.valor = valor;
            }
        }

        public Dato buscar(string clave) {
            for (int i = 0; i < data.Count; i++) {
                Dato d = data[i];
                if (d.clave.Equals(clave, StringComparison.CurrentCultureIgnoreCase)) {
                    return d;
                }
            }
            return null;
        }

        public virtual bool guardar() {
            try {
                using( StreamWriter sw = new StreamWriter(nombreFichero, false, Encoding.Default)) {
                    foreach(Dato d in data) {
                        if (d.clave == "##" ) {
                            sw.WriteLine(d.valor);
                        } else {
                            sw.WriteLine(d.clave + "=" + d.valor);
                        }
                    }
                }
                return true;
            } catch (Exception exc) {
                LogExcepcion.guardar("Error al guardar fichero de configuracion", exc);
                return false;
            }
        }

        protected string valor(string clave, string porDefecto) {
            Dato dato = buscar(clave);
            if (dato == null) {
                return porDefecto;
            } else {
                return dato.valor;
            }
        }

        protected int valor(string clave, int porDefecto) {
            Dato dato = buscar(clave);
            if (dato == null) {
                return porDefecto;
            }
            int valor;
            if (Int32.TryParse(dato.valor, out valor)) {
                return valor;
            } else {
                return porDefecto;
            }
        }

        protected long valor(string clave, long porDefecto) {
            Dato dato = buscar(clave);
            if (dato == null) {
                return porDefecto;
            }
            long valor;
            if (Int64.TryParse(dato.valor, out valor)) {
                return valor;
            } else {
                return porDefecto;
            }
        }

        protected float valor(string clave, float porDefecto) {
            Dato dato = buscar(clave);
            if (dato == null) {
                return porDefecto;
            }
            float valor;
            if (Single.TryParse(dato.valor, out valor)) {
                return valor;
            } else {
                return porDefecto;
            }
        }

        protected double valor(string clave, double porDefecto) {
            Dato dato = buscar(clave);
            if (dato == null) {
                return porDefecto;
            }
            double valor;
            if (Double.TryParse(dato.valor, out valor)) {
                return valor;
            } else {
                return porDefecto;
            }
        }

        protected bool valor(string clave, bool porDefecto) {
            Dato dato = buscar(clave);
            if (dato == null) {
                return porDefecto;
            }
            if (dato.valor.ToLower() == "si") {
                return true;
            }
            return false;
        }

        protected System.Drawing.Color valor(string clave, System.Drawing.Color porDefecto) {
            Dato dato = buscar(clave);
            if (dato != null) {
                try {
                    string[] rgb = dato.valor.Split(',');
                    System.Drawing.Color color = System.Drawing.Color.FromArgb(
                        Int32.Parse(rgb[0].Trim()),
                        Int32.Parse(rgb[1].Trim()),
                        Int32.Parse(rgb[2].Trim()));
                    return color;
                } catch { }
            }
            return porDefecto;
        }

    }
    
    public class Dato
    {
        public string clave;
        public string valor;
        public Dato(string p1, string p2) {
            clave = p1;
            valor = p2;
        }
    }

}
