package jforex.account;

import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


import com.dukascopy.api.*;

public class UseOfLeverageAlerter implements IStrategy {

    double lastUseOfLeverage;
    private IAccount account;
    private IConsole console;
    
    @Configurable("Alarm file")
    public File alarmFile;
    
    
    @Configurable("Use dialog")
    public boolean showDialog = true;
    
    @Override
    public void onStart(IContext context) throws JFException {
        account = context.getAccount();
        console = context.getConsole();
        lastUseOfLeverage = context.getAccount().getUseOfLeverage();

    }

    @Override
    public void onTick(Instrument instrument, ITick tick) throws JFException {
        double currentUseOfLeverage = account.getUseOfLeverage();
        if(Double.compare(currentUseOfLeverage, lastUseOfLeverage) != 0){
            String infoMessage = String.format("Leverage changed from %s to %s",
                    lastUseOfLeverage, currentUseOfLeverage);
            playSound(alarmFile);
            console.getOut().println(infoMessage);
            if(showDialog){
                JOptionPane.showMessageDialog(new JFrame("dialog"),infoMessage);
               
            }
            lastUseOfLeverage = currentUseOfLeverage;
        }
    }

   
    
    private void playSound(File wavFile) throws JFException {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(wavFile);
            AudioFormat af = audioInputStream.getFormat();
            int nSize = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
            byte[] audio = new byte[nSize];
            DataLine.Info info = new DataLine.Info(Clip.class, af, nSize);
            audioInputStream.read(audio, 0, nSize);
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, nSize);
            clip.start();
        } catch (Exception e) {
            e.printStackTrace();
            throw new JFException(e);
        }
    }
    
    
    
    
    
    
    @Override
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}

    @Override
    public void onMessage(IMessage message) throws JFException {}

    @Override
    public void onAccount(IAccount account) throws JFException {}

    @Override
    public void onStop() throws JFException {}

}
