//import clas-clas yang diperlukan
import java.io.FileOutputStream;
import java.io.File;
import java.util.Formatter;
import java.util.Scanner;

public class retest {
    
    //deklarasi scanner untuk pembacaan dari keyboard
    private static Scanner bacaInput = new Scanner(System.in);

    public static void entry() {
        //pemasukan data-data dari keyboard
        System.out.println("Entry");
        System.out.print("Nobill : ");
        //baca nobill dengan tipe data int
        int nobill = bacaInput.nextInt();
        System.out.print("Amount : ");
        //baca amount dengan tipe data long
        long amount = bacaInput.nextLong();
        System.out.print("Debet : ");
        //baca debet dengan tipe data long
        long debet = bacaInput.nextLong();
        System.out.print("Credit : ");
        //baca credit dengan tipe data long
        long credit = bacaInput.nextLong();
        System.out.print("Voucher : ");
        //baca voucher dengan tipe data long
        long voucher = bacaInput.nextLong();
        //deklarasi formatter
        Formatter f;
        try {
            //menginstantiasikan objek dengan nama f dari Formatter 
            //dengan parameter berupa instantiasi FileOutputStream
            //dengan parameter nama file, dan true (agar bisa diappend)
            //append : terus melakukan penambahan pada file text, tidak menimpa
            f = new Formatter(new FileOutputStream("RMD.TXT", true));
            //untuk melakukan penulisan ke file, digunakan fungsi format
            //dengan parameter berupa format dan nilai yang akan dimasukkan        
            //%d untuk integer juga long
            //sedangkan -10 untuk menambahkan spasi setelah penulisan, begitu kira-kira
            //sehingga didapatkan format yang rapi
            f.format("%-10d %-10d %-10d %-10d %-10d \n", nobill, amount, debet, credit, voucher);
            //penutupan aliran data formatter
            f.close();
        } catch (Exception e) {
            System.out.println("Pesan error " + e);
        }
    }

    public static void load() {
        //deklarasi scanner
        Scanner bacaFile;
        System.out.println("Load");
        //penulisan header dengan menggunakan printf (request bapak dosen)
        //%s untuk String
        //-10 untuk penambahan spasi dengan perataan kiri
        //10 untuk penambahan spasi dengan peratan kanan
        System.out.printf("%-10s %10s %10s %10s %10s \n", "NOBILL", "AMOUNT", "DEBET", "CREDIT", "VOUCHER");
        //deklarasi dan inisialisasi total-total 
        long totalAmount = 0;
        long totalDebet = 0;
        long totalCredit = 0;
        long totalVoucher = 0;
        long totalCash = 0;
        try {
            //baca RMD.TXT dengan menggunakan scanner
            bacaFile = new Scanner(new File("RMD.TXT"));
            //terus melakukan perulangan selama dalam txt masih menemukan
            //adanya karakter / kata
            while (bacaFile.hasNext()) {
                //format pembacaan disesuaikan dengan apa yang akan dibaca                
                //nextInt untuk int
                //nextLong untuk long
                //ditampung terlebih dahulu dalam variabel
                //untuk melakukan operasi total
                //pembacaan untuk nobill 
                int nobill = bacaFile.nextInt();
                //pembacaan untuk amount dan melakukan pengupdatean variabael 
                //totalAmount
                long amount = bacaFile.nextLong();
                totalAmount += amount;
                //pembacaan untuk debet dan melakukan pengupdatean variabael 
                //totalDebet
                long debet = bacaFile.nextLong();
                totalDebet += debet;
                //pembacaan untuk credit dan melakukan pengupdatean variabael 
                //totalCredit
                long credit = bacaFile.nextLong();
                totalCredit += credit;
                //pembacaan untuk voucher dan melakukan pengupdatean variabael 
                //totalVoucher
                long voucher = bacaFile.nextLong();
                totalVoucher += voucher;
                //menampilkan masing-masing baris dengen printf dan
                ////%d untuk int juga long
                System.out.printf("%-10d %10d %10d %10d %10d", nobill, amount, debet, credit, voucher);
                System.out.println();
            }
            totalCash = totalAmount - (totalDebet + totalCredit + totalVoucher);
            //menampilkan total-total
            System.out.printf("%-20s %10d \n", "Total Amount", totalAmount);
            System.out.printf("%-20s %10d \n", "Debet", totalDebet);
            System.out.printf("%-20s %10d \n", "Credit", totalCredit);
            System.out.printf("%-20s %10d \n", "Voucher", totalVoucher);
            System.out.printf("%-20s %10d \n", "Cash", totalCash);
        } catch (Exception e) {
            System.out.println("Pesan error " + e);
        }
    }

    public static void main(String[] args) {
        //pengulangan program selamanya
        while (true) {
            System.out.println("Menu");
            System.out.println("1. Entry");
            System.out.println("2. Load");
            System.out.println("3. Exit");
            System.out.print("Pilihan Anda : ");
            //pembacaan pilihan menu dari input keyboard
            int pilih = bacaInput.nextInt();
            switch (pilih) {
                case 1:
                    //perulangan selama pengguna menginputkan huruf E atau e
                    do {
                        //pemanggilan fungsi entry
                        entry();
                        System.out.print("Inputkan selain E untuk berhenti... ");
                    } while (bacaInput.next().equalsIgnoreCase("E"));
                    break;
                case 2:
                    //pemanggilan fungsi load
                    load();
                    break;
                case 3:
                    //melakukan exit pada program
                    System.exit(0);
                    break;
            }
        }

    }
}

