/*
 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
 *
 * 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.drools.examples.broker.events;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.text.MessageFormat;
import java.text.ParseException;

import org.drools.examples.broker.model.StockTick;

/**
 * A helper to save and load StockTicks
 */
public class StockTickPersister implements EventSource {

    private MessageFormat format = new MessageFormat("{0,number,0};{1};{2,number,currency}");
    private BufferedWriter out;
    private BufferedReader in;
    private long baseTimestamp;
    private Event<StockTick> next;
    
    public void openForSave( Writer writer ) throws IOException {
        out = new BufferedWriter( writer );
    }
    
    public void openForRead( Reader reader, long baseTimestamp ) throws FileNotFoundException {
        in = new BufferedReader( reader );
        this.baseTimestamp = baseTimestamp;
    }
    
    public void save( StockTick tick ) throws IOException {
        Object[] args = new Object[] {
                                      tick.getTimestamp(),
                                      tick.getSymbol(),
                                      tick.getPrice()
        };
        out.append( format.format( args ) + "\n" );
    }
    
    public StockTick load() throws ParseException, IOException {
        String line = in.readLine();
        if (line == null) {
            System.out.println("End of file");
            return null;
        }
        Object[] results = format.parse(line);
        StockTick tick = new StockTick( (String)results[1],
                                        ((Number)results[2]).doubleValue(),
                                        ((Number)results[0]).longValue()+baseTimestamp );
        return tick;
    }
    
    public void close() throws IOException {
        if( out != null ) {
            out.close();
        }
        if( in != null ) {
            in.close();
        }
    }

    public Event<StockTick> getNext() {
        return next;
    }

    public boolean hasNext() {
        if( in != null ) {
            try {
                StockTick tick = load();
                if (tick == null) {
                    return false;
                }
                next = new EventImpl<StockTick>( tick.getTimestamp(), tick );
                return true;
            } catch ( Exception e ) {
                // nothing to do, return false
                e.printStackTrace();
                return false;
            }
        }
        return false;
    }

}
