/*
 * Copyright 2006 Niclas Hedhman.
 *
 * Licensed  under the  Apache License,  Version 2.0  (the "License");
 * you may not use  this file  except in  compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed  under the  License is distributed on an "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
 * implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.qi4j.logging.debug.service;

import java.io.PrintStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.ResourceBundle;
import org.qi4j.api.Qi4j;
import org.qi4j.api.composite.Composite;
import org.qi4j.api.injection.scope.Invocation;
import org.qi4j.api.sideeffect.SideEffectOf;
import org.qi4j.logging.debug.Debug;
import org.qi4j.logging.log.service.LoggingService;

import static org.qi4j.functional.Iterables.first;

/**
 * The DebugOnConsoleSideEffect is just a temporary solution for logging output, until a more
 * robust framework has been designed.
 */
public class DebugOnConsoleSideEffect extends SideEffectOf<LoggingService>
    implements DebuggingService
{
    private static PrintStream OUT = System.err;

    private final ResourceBundle bundle;

    public DebugOnConsoleSideEffect( @Invocation Method thisMethod )
    {
        bundle = ResourceBundle.getBundle( thisMethod.getDeclaringClass().getName() );
    }

    @Override
    public int debugLevel()
    {
        return Debug.OFF;
    }

    @Override
    public void debug( Composite composite, String message )
    {
        String localized = bundle.getString( message );
        OUT.println( "DEBUG:" + getCompositeName( composite ) + ": " + localized );
    }

    private String getCompositeName( Composite composite )
    {
        return first( Qi4j.FUNCTION_DESCRIPTOR_FOR.map( composite ).types()).getName();
    }

    @Override
    public void debug( Composite composite, String message, Serializable param1 )
    {
        String localized = bundle.getString( message );
        String formatted = MessageFormat.format( localized, param1 );
        OUT.println( "DEBUG:" + getCompositeName( composite ) + ": " + formatted );
        if( param1 instanceof Throwable )
        {
            handleException( (Throwable) param1 );
        }
    }

    @Override
    public void debug( Composite composite, String message, Serializable param1, Serializable param2 )
    {
        String localized = bundle.getString( message );
        String formatted = MessageFormat.format( localized, param1, param2 );
        OUT.println( "DEBUG:" + getCompositeName( composite ) + ": " + formatted );
        if( param1 instanceof Throwable )
        {
            handleException( (Throwable) param1 );
        }
    }

    @Override
    public void debug( Composite composite, String message, Serializable... params )
    {
        String localized = bundle.getString( message );
        String formatted = MessageFormat.format( localized, (Serializable) params );
        OUT.println( "DEBUG:" + getCompositeName( composite ) + ": " + formatted );
        if( params[ 0 ] instanceof Throwable )
        {
            handleException( (Throwable) params[ 0 ] );
        }
    }

    private void handleException( Throwable exception )
    {
        if( exception != null )
        {
            exception.printStackTrace( OUT );
        }
    }
}