namespace GMLL00ImportadorXsd.Utilidades.Log
{
    using System;
    using ADRU05Logs.Core;
    using Corp.Wcf.FechaHora;

    public sealed class Logger
    {
        private const string UsuarioWindowsDefecto = "(null)";

        private readonly ADRU05Logs.Core.Logger logger;
        private readonly string ficheroConfiguracionWcorpFechaHora;

        public Logger(ConfiguracionLogger configuracion)
        {
            this.logger = new ADRU05Logs.Core.Logger(
                configuracion.CarpetaLogs,
                configuracion.CodigoAplicacion,
                configuracion.DepartamentoPropietarioAplicacion,
                configuracion.NumeroLogsDefecto,
                UsuarioWindowsDefecto,
                configuracion.UsuarioAplicacion);

            this.ficheroConfiguracionWcorpFechaHora = configuracion.FicheroConfiguracionWCORPFechaHora;
        }

        public void LogExcepcion(
            string mensaje,
            Exception exception,
            DateTime fechaHora)
        {
            this.Log(TipoLog.Excepción, mensaje, exception.ToString(), fechaHora);
        }

        public void LogExcepcion(
            string mensaje,
            Exception exception)
        {
            this.LogExcepcion(mensaje, exception, this.ObtenerFechaHoraActual());
        }

        public void LogLog(
            string mensaje,
            string mensajeExtendido,
            DateTime fechaHora)
        {
            this.Log(TipoLog.Log, mensaje, mensajeExtendido, fechaHora);
        }

        public void LogLog(
            string mensaje,
            string mensajeExtendido)
        {
            this.LogLog(mensaje, mensajeExtendido, this.ObtenerFechaHoraActual());
        }

        public void LogTraza(
            string mensaje,
            string mensajeExtendido,
            DateTime fechaHora)
        {
            this.Log(TipoLog.Traza, mensaje, mensajeExtendido, fechaHora);
        }

        public void LogTraza(
            string mensaje,
            string mensajeExtendido)
        {
            this.LogTraza(mensaje, mensajeExtendido, this.ObtenerFechaHoraActual());
        }

        private void Log(
            TipoLog tipoLog,
            string mensaje,
            string mensajeExtendido,
            DateTime fechaHora)
        {
            this.logger.Log(tipoLog, mensaje, mensajeExtendido, fechaHora, OrigenFechaHora.Db2);
        }

        private DateTime ObtenerFechaHoraActual()
        {
            DateTime fechaHoraActual;

            using (var fechaHora = new FechaHora(this.ficheroConfiguracionWcorpFechaHora))
            {
                fechaHoraActual = fechaHora.ObtenerFechaHora(WCORPFechaHora.OrigenFechaHora.DB2);
            }

            return fechaHoraActual;
        }
    }
}