package terminal;

import opencard.core.service.*;
import opencard.core.terminal.*;
import opencard.opt.terminal.*;
import opencard.opt.util.*;

public class ChipknipTerminal
{
   CardTerminal terminal;
   PassThruCardService service;

   public ChipknipTerminal() {
      try {
         SmartCard.start();
         CardTerminalRegistry terminalRegistry = CardTerminalRegistry.getRegistry();
         terminal = (CardTerminal)terminalRegistry.getCardTerminals().nextElement();
         cardSession(CardRequest.ANYCARD);
         while (true) {
            cardSession(CardRequest.NEWCARD);
         }
      } catch (Exception e) {
         System.out.println("ERROR: " + e.getMessage());
      }
   }

   void cardSession(int requestType) {
      try {
         CardRequest request = new CardRequest(requestType,terminal,PassThruCardService.class);
         SmartCard card = SmartCard.waitForCard(request);
         service = (PassThruCardService)card.getCardService(PassThruCardService.class,true);
         System.out.println("CHIPKNIP BALANCE: " + amountString(getBalance()));
      } catch (Exception e) {
         System.out.println("ERROR: " + e.getMessage());
      }
   }

   int getBalance() throws CardTerminalException {
      CommandAPDU capdu = new ISOCommandAPDU((byte)0xE1,(byte)0xB4,(byte)0x00,(byte)0x01,5);
      ResponseAPDU rapdu = service.sendCommandAPDU(capdu);
      return ((rapdu.data()[0] & 0x000000FF) << 16) |
             ((rapdu.data()[1] & 0x000000FF) << 8) |
             (rapdu.data()[2] & 0x000000FF);
   }

   static String amountString(int value) {
      return (value / 100) + "." + (((value % 100) < 10) ? "0" : "") + (value % 100);
   }

   public static void main(String[] arg) {
      new ChipknipTerminal();
   }
}

