package org.apache.maven.wagon.observers;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import org.apache.maven.wagon.events.SessionEvent;
import org.apache.maven.wagon.events.SessionListener;
import org.apache.maven.wagon.events.TransferEvent;
import org.apache.maven.wagon.events.TransferListener;

import java.io.PrintStream;

/**
 * @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
 *
 */
public class Debug
    implements SessionListener, TransferListener
{
    private PrintStream out;

    long timestamp;

    long transfer;

    public Debug()
    {
        this( System.out );
    }

    public Debug( PrintStream out )
    {
        this.out = out;
    }

    /**
     * @see SessionListener#sessionOpening(SessionEvent)
     */
    public void sessionOpening( final SessionEvent sessionEvent )
    {
        //out.println( .getUrl() + " - Session: Opening  ");
    }

    /**
     * @see SessionListener#sessionOpened(SessionEvent)
     */
    public void sessionOpened( final SessionEvent sessionEvent )
    {
        out.println( sessionEvent.getWagon().getRepository().getUrl() + " - Session: Opened  " );
    }

    /**
     * @see SessionListener#sessionDisconnecting(SessionEvent)
     */
    public void sessionDisconnecting( final SessionEvent sessionEvent )
    {
        out.println( sessionEvent.getWagon().getRepository().getUrl() + " - Session: Disconnecting  " );

    }

    /**
     * @see SessionListener#sessionDisconnected(SessionEvent)
     */
    public void sessionDisconnected( final SessionEvent sessionEvent )
    {
        out.println( sessionEvent.getWagon().getRepository().getUrl() + " - Session: Disconnected" );
    }

    /**
     * @see SessionListener#sessionConnectionRefused(SessionEvent)
     */
    public void sessionConnectionRefused( final SessionEvent sessionEvent )
    {
        out.println( sessionEvent.getWagon().getRepository().getUrl() + " - Session: Connection refused" );

    }

    /**
     * @see SessionListener#sessionLoggedIn(SessionEvent)
     */
    public void sessionLoggedIn( final SessionEvent sessionEvent )
    {
        out.println( sessionEvent.getWagon().getRepository().getUrl() + " - Session: Logged in" );

    }

    /**
     * @see SessionListener#sessionLoggedOff(SessionEvent)
     */
    public void sessionLoggedOff( final SessionEvent sessionEvent )
    {
        out.println( sessionEvent.getWagon().getRepository().getUrl() + " - Session: Logged off" );

    }

    /**
     * @see TransferListener#debug(String)
     */
    public void debug( final String message )
    {
        out.println( message );

    }

    public void transferInitiated( TransferEvent transferEvent )
    {
        // This space left intentionally blank
    }

    /**
     * @see TransferListener#transferStarted(TransferEvent)
     */
    public void transferStarted( final TransferEvent transferEvent )
    {
        timestamp = transferEvent.getTimestamp();

        transfer = 0;

        if ( transferEvent.getRequestType() == TransferEvent.REQUEST_GET )
        {
            final String message = "Downloading: " + transferEvent.getResource().getName() + " from "
                + transferEvent.getWagon().getRepository().getUrl();

            out.println( message );

            out.println( "" );
        }
        else
        {
            final String message = "Uploading: " + transferEvent.getResource().getName() + " to "
                + transferEvent.getWagon().getRepository().getUrl();

            out.println( message );

            out.println( "" );

        }
    }

    /**
     * @see TransferListener#transferProgress(TransferEvent,byte[],int)
     */
    public void transferProgress( final TransferEvent transferEvent, byte[] buffer, int length )
    {

        out.print( "#" );
        //String data = new String( transferEvent.getData(),0, transferEvent.getDataLength());
        //out.println(data);
        transfer += length;
    }

    /**
     * @see TransferListener#transferCompleted(TransferEvent)
     */
    public void transferCompleted( final TransferEvent transferEvent )
    {
        final double duration = (double) ( transferEvent.getTimestamp() - timestamp ) / 1000;

        out.println();

        final String message = "Transfer finished. " + transfer + " bytes copied in " + duration + " seconds";

        out.println( message );

    }

    /**
     * @see TransferListener#transferError(TransferEvent)
     */
    public void transferError( final TransferEvent transferEvent )
    {
        out.println( " Transfer error: " + transferEvent.getException() );

    }

    /**
     * @see SessionListener#sessionError(SessionEvent)
     */
    public void sessionError( final SessionEvent sessionEvent )
    {
        out.println( " Session error: " + sessionEvent.getException() );

    }

    public PrintStream getOut()
    {
        return out;
    }

}
