import easyIO.*;

public class Oblig3 {

    public static void main(String[] args) {
        Oblig3 oblig3kjøring = new Oblig3(args);
    }

    Oblig3(String[] inputfiler) {
        String datafil = "HaiHus.data";
        String strømfil = "Lysregning.data";

        if(inputfiler.length > 0)
        datafil = inputfiler[0];

        if(inputfiler.length > 1)
        strømfil = inputfiler[1];

        Hybelhus utsyn = new Hybelhus(datafil,strømfil);
        utsyn.kommandoløkke();
    }
}






class Student{

    int saldo;
    String navn;

    Student (int saldo, String navn){
        this.saldo = saldo;
        this.navn = navn;
        }
        Student(){}

    } // End class Student








    class Hybel{

        Student leietager;
        int utestående; // Brukes for strøm hvis leietager == null

        Hybel (String leietager, int utestående){
            if (leietager.equals("TOM HYBEL")) {
                this.utestående = utestående;
            } else {
                this.leietager = new Student(utestående,leietager);
                //this.utestående = utestående;
            }
        }

    } // End class Hybel








    class Hybelhus {

        private String datafil;
        private String strømfil;

        final int ANT_KOR = 4;
        final int ANT_ROM = 8;

        final String TOM_HYBEL = "TOM HYBEL";

        private int totalFortjeneste;
        private int antallHybelmånederMedTommeHybler;
        private int totaltAntallMåneder;

        In tastatur = new In();
        Out skjerm = new Out();

        private Hybel[][] hyblene = new Hybel[ANT_KOR][ANT_ROM];


        Hybelhus( String datafil, String strømfil ) { // Her starter konstruktøren til Hybelhus
            this.datafil = datafil;
            this.strømfil = strømfil;

            skjerm.outln("Leser fra " + datafil + ":");
            In hybelfil = new In(datafil);
            for(int i = 0; i < ANT_KOR * (ANT_ROM - 1); i++) {

                int gang = hybelfil.inInt(";"); skjerm.out(gang);
                char bokstav = hybelfil.inChar(";"); skjerm.out(bokstav);
                String studentnavn = hybelfil.inWord(";"); skjerm.out(" " + studentnavn);
                int saldo = hybelfil.inInt(";"); skjerm.outln(" " + saldo);

                hybelfil.readLine(); //for å bli kvitt resten av linja
                hyblene[gang - 1][(int)(bokstav - 'A')] = new Hybel(studentnavn.trim(), saldo);

                }

                totaltAntallMåneder = hybelfil.inInt(";");
                antallHybelmånederMedTommeHybler = hybelfil.inInt(";");
                totalFortjeneste = hybelfil.inInt(";");
                hybelfil.close();
            } // Konstruktør hybelhus slutt




           void skrivMeny() {
                    skjerm.outln("");
                    skjerm.outln("");
                    skjerm.outln("*** Gulbrand Grås husleiesystem ***");
                    skjerm.outln("");
                    skjerm.outln("Du har følgende valgmuligheter:");
                    skjerm.outln("0) Avslutt");
                    skjerm.outln("1) Skriv liste over ledige hybler");
                    skjerm.outln("2) Registrer ny leietager");
                    skjerm.outln("3) Registrer frivillig flytting av leietager");
                    skjerm.outln("4) Måneds-kjøring av husleie med strøm");
                    skjerm.outln("5) Registrer betaling fra leietager");
                    skjerm.outln("6) Sjekk om noen leietagere skal kastes ut");
                    skjerm.outln("7) Skriv økonomirapport");
                    skjerm.outln("8) Skriv ut menyen");

                    }

            void kommandoløkke(){

                skrivMeny();
                int kommando = 1;

                        while (kommando != 0) {
                            kommando = velgOperasjon();

                            switch (kommando) {
                                case 0: Avslutt();                               break;
                                case 1: skrivListeOverLedigeHybler();            break;
                                case 2: registrerNyLeietager();                  break;
                                case 3: registrerFrivilligFlyttingAvLeietager(); break;
                                case 4: månedsKjøringAvHusleieMedStrøm();        break;
                                case 5: registrerBetalingFraLeietager();         break;
                                case 6: sjekkOmNoenLeietagereSkalKastesUt();     break;
                                case 7: skrivØkonomirapport();                   break;
                                case 8: skrivMeny();                             break; // For å kunne se menyen når det trengs
                                default: skjerm.outln("Du har tastet feil");     break;
                            } // end switch
                        } // end while flere kommandoer

                        System.out.println("**AVSLUTTNING PÅ HUSLEIESYSTEMET**");
                    } //end ordreløkke



                int velgOperasjon() {
                    skjerm.out("Velg en kommando: ");

                    int kommando = tastatur.inInt();
                    return kommando;


                } // End kommandoløkke







    void Avslutt(){
        Out lagre = new Out("HaiHus.data");

        for(int i = 0; i < ANT_KOR; i++){
            for(int j = 1; j < ANT_ROM; j++){ //Tar ikke med fellesarealene her

            lagre.out(i+1+";");
            lagre.out((char)('A' + j)+";"); // Gjør om til char "eks. 2 blir C"

            if(hyblene[i][j].leietager != null){
                lagre.outln(hyblene[i][j].leietager.navn + ";" + hyblene[i][j].leietager.saldo + ";");

                }else{lagre.outln("TOM HYBEL" + ";" + hyblene[i][j].utestående + ";");
                } // Hvis leietager er null settes TOM HYBEL inn pluss utestående beløp
                }
            }

                lagre.out(totaltAntallMåneder + ";");
                lagre.out(antallHybelmånederMedTommeHybler + ";");
                lagre.out(totalFortjeneste);

            lagre.close();
            skjerm.outln("Data er nå lagret i HaiHus.data");

        } // End Avslutt






    void skrivListeOverLedigeHybler(){
        skjerm.outln("Liste over ledige hybler:");

        for(int i = 0; i < ANT_KOR; i++){
            for(int j = 1; j < ANT_ROM; j++){ //Tar ikke med fellesarealene her
            if(hyblene[i][j].leietager == null){ // Sjekker null peker i leietager objektet
            skjerm.out(i+1);
            skjerm.out((char)('A' + j) + " ");
            skjerm.outln("");
        }
    }
    }
    } // End ledige hybler






    void registrerNyLeietager(){

        skjerm.outln("Registrer ny leietager:");
        skjerm.outln("");

        skjerm.outln("Hvilken hybel ønsker du å leie: (eks. 3B)");
        skjerm.outln("");
        skjerm.out("Gang:");
        int gang = tastatur.inInt();
        skjerm.out("Bokstav:");
        tastatur.skipWhite();
        char bokstav = tastatur.inChar();
        int rom = (int) (bokstav - 'A');

        skjerm.outln("Gulbrands totale fortjeneste er: " + totalFortjeneste); // Sjekker at Gulbrand får pengene sine


        if (hyblene[gang-1][rom].leietager != null){ // Sjekker om arrayen peker på et hybelobjekt
            skjerm.outln("Hybelen er opptatt, se liste over ledige hybler");

        }else{


            hyblene[gang-1][rom].leietager = new Student();

            skjerm.outln("Skriv leietagerens navn:");
            hyblene[gang-1][rom].leietager.navn= tastatur.inLine();


            hyblene[gang-1][rom].leietager.saldo = 9000; // Oppdaterer saldo til studenten
            totalFortjeneste += 5500; // Oppdaterer fortjenesten til Gulbrand
            hyblene[gang-1][rom].leietager.saldo -= 5500; // Trekker månedsleie fra studentens innskudd


            totalFortjeneste-=hyblene[gang-1][rom].utestående; // Legger til evt utestående beløp til Gulbrands fortjeneste
            hyblene[gang-1][rom].leietager.saldo+=hyblene[gang-1][rom].utestående; // Trekker ifra evt utestående. Utestående er et negativt tall derfor '+='
            hyblene[gang-1][rom].utestående = 0;                                           // beløp fra studentens saldo

            skjerm.outln("");
            skjerm.outln("Hybelen er nå utleid til " + hyblene[gang-1][rom].leietager.navn);
            skjerm.outln("og saldo er " + hyblene[gang-1][rom].leietager.saldo);
            skjerm.outln("Gulbrands totale fortjeneste er nå: " + totalFortjeneste); // Sjekker at Gulbrand får pengene sine

            }

        } // End ny leietager






    void registrerFrivilligFlyttingAvLeietager(){

        skjerm.outln("Registrer frivillig flytting:");
        skjerm.outln("");

        skjerm.outln("Hvilken hybel ønsker du å flytte fra: (eks. 3B)");
        skjerm.outln("");
        skjerm.out("Gang:");
        int gang = tastatur.inInt();
        skjerm.out("Bokstav:");
        tastatur.skipWhite();
        char bokstav = tastatur.inChar();
        int rom = (int) (bokstav - 'A');


        Student s = hyblene[gang-1][rom].leietager;


            skjerm.out("Navn på studenten:");
            String tastetNavn = tastatur.inLine(); // Lager her en string av navnet for å kontrollere om det samsvarer med det i arrayen

    //      skjerm.outln("s:" + s.navn + " tastet:" + tastetNavn);
            skjerm.outln("Gulbrands totale fortjeneste: " + totalFortjeneste);


            if(s != null && s.navn.equals(tastetNavn)){

            hyblene[gang-1][rom].leietager.saldo -= 800;
            totalFortjeneste += 800;
            skjerm.outln("Studenten har til gode eller er skyldig følgende beløp: " + hyblene[gang-1][rom].leietager.saldo);
            skjerm.outln("*** Nå er hybelen ledig! ***");
            hyblene[gang-1][rom].leietager = null; // Leietager blir satt til null



            }else{skjerm.out("Det er ingen som eier hybelen, eller så er det tastet inn feil navn på studenten");
            }

            skjerm.outln("Gulbrands totale fortjeneste er nå: " + totalFortjeneste);

        }// End frivillig flytting



    void månedsKjøringAvHusleieMedStrøm(){

        double strømRegStud = 0;
        double strømRegGulb = 0;
        double strømFortjen = 0;
        double fellesArealReg = 0;
        double strømTomHybel = 0;

    //  skjerm.outln(totalFortjeneste); // Teste totalfortjeneste

        for(int i = 0; i < ANT_KOR; i++){
            for(int j = 1; j < ANT_ROM; j++){ //Tar ikke med fellesarealene her
            if(hyblene[i][j].leietager != null) {
                hyblene[i][j].leietager.saldo -=5500;
                totalFortjeneste += 5500;

        //      skjerm.outln(hyblene[i][j].leietager.saldo); // Bare for å teste leietager saldo

                }
                totalFortjeneste -=1000;
            }
        }

                skjerm.outln("Leser fra " + strømfil + ":");
                In lysregning = new In(strømfil);
               for(int i = 0; i < ANT_KOR; i++){
                  for(int j = 0; j < ANT_ROM; j++){ // Her må også man begynne på 0 slik at den får med seg hele fila!

                int husnr = lysregning.inInt(":"); //skjerm.out(husnr);
                int gangnr = lysregning.inInt(":"); //skjerm.out(gangnr);
                char bokstav = lysregning.inChar(":"); //skjerm.out(bokstav);
                int kwt = lysregning.inInt(":"); //skjerm.outln(kwt);

         //     lysregning.readLine(); //for å bli kvitt resten av linja // Ser ikke ut som om denne er nødvendig



                int gang1 = (gangnr-1);
                int boks1 = (int)(bokstav - 'A'); // Omgjøring fra fila til tall og bokstav "eks. 1B"

                if(bokstav == ('A')){
                    fellesArealReg = kwt*0.8;
                    totalFortjeneste += fellesArealReg;
                    }

                else if(hyblene[gang1][boks1].leietager == null){
                    strømTomHybel = kwt*0.8;
                    totalFortjeneste -= strømTomHybel;
                    antallHybelmånederMedTommeHybler++;
                //  skjerm.outln(strømTomHybel+ "," + kwt); // Kun ment som test
                    }

                else if(hyblene[gang1][boks1].leietager != null){
                    strømRegStud = kwt*2.0;
                //  strømRegGulb = kwt*0.8; // Blir overflødig...?!
                    strømFortjen = kwt*1.2;
                    hyblene[gang1][boks1].leietager.saldo -= strømRegStud;
                    totalFortjeneste += strømFortjen;
            //      skjerm.outln(strømRegStud); // Bare for å teste strømregningen
            //      skjerm.outln(hyblene[gang1][boks1].leietager.saldo); // Bare for å teste leietager saldo

        }

                    }
            }

                lysregning.close();

                totaltAntallMåneder++;
                skjerm.outln("Månedskjøring: " + totaltAntallMåneder + " er gjennomført");

        } // End månedskjøring





    void registrerBetalingFraLeietager(){

        skjerm.outln("Registrer betaling fra leietager:");
        skjerm.outln("");

        skjerm.outln("Hvilken hybel ønsker du å betale for: (eks. 3B)");
        skjerm.outln("");
        skjerm.out("Gang:");
        int gang = tastatur.inInt();
        skjerm.out("Bokstav:");
        tastatur.skipWhite();
        char bokstav = tastatur.inChar();
        int rom = (int) (bokstav - 'A');

        if(hyblene[gang-1][rom].leietager == null){
            skjerm.outln("Betalingen kan ikke registreres siden det ikke bor noen i hybelen!");

            }else{
                skjerm.outln("Saldo er nå: " + hyblene[gang-1][rom].leietager.saldo);
                skjerm.out("Hvor mye ønsker du å betale:");
            int beløp = tastatur.inInt();
            hyblene[gang-1][rom].leietager.saldo += beløp; // Legger til intastet beløp i arrayen

            skjerm.outln("Betaling gjennomført!");
            skjerm.outln("Saldo etter betaling er: " + hyblene[gang-1][rom].leietager.saldo);

            }


        } // End betaling fra leietager





    void sjekkOmNoenLeietagereSkalKastesUt(){

        int tellerTorpedo = 0;



        skjerm.outln("Sjekk om noen må kastes ut");

    //  skjerm.outln(totalFortjeneste); // Bare for å sjekke om Gulbrand får pengene sine

        for(int i = 0; i < ANT_KOR; i++){
            for(int j = 1; j < ANT_ROM; j++){ //Tar ikke med fellesarealene her
            if(hyblene[i][j].leietager != null){
                if(hyblene[i][j].leietager.saldo < 0){ // Sjekker null peker i leietager objektet


            int saldo = hyblene[i][j].leietager.saldo;
            int gjeld = (saldo - 1000);
            totalFortjeneste-=gjeld; // Setter minus her fordi saldo har minus verdi
            int gang1 = (i+1);
            char boks1 = (char)('A' + j); // Her konverterer jeg fra tall i arrayen til bokstav
            String hybelNavn = (gang1+""+boks1);  // Legger inn hybel og navn i stringverdier for senere bruk i skrive til fil
            String studentNavn = hyblene[i][j].leietager.navn;

        //  skjerm.outln(totalFortjeneste); // Bare for å sjekke at Gulbrand får pengene sine

            skjerm.outln(studentNavn + hybelNavn); // Skriver ut navnet på studneten som skal kastes ut

            hyblene[i][j].leietager = null;

            tilkallTorpedo(hybelNavn,studentNavn,gjeld);
            tellerTorpedo++;
        }
    }
}
}

if(tellerTorpedo>0) {
    skjerm.outln("Leietagere som skal kastes ut er nå lagt i Torpedo.txt");
    }else{skjerm.outln("Ingen leietagere trenger å kastes ut denne måneden");
}

} // End kastes ut


void tilkallTorpedo (String hybelNavn, String studentNavn, int gjeld){
    Out torpedo = new Out("Torpedo.txt",true);
    torpedo.outln(hybelNavn+ ": "+ studentNavn +": "+ gjeld +";");

    torpedo.close();


}// end tilkallTorpedo




    void skrivØkonomirapport(){
        skjerm.outln("*** Økonomirapport ***");
        skjerm.outln("");
        skjerm.outln("Gulbrand Grå har tjent totalt: " + totalFortjeneste);
        skjerm.outln("Antall måneder med tomme hybler er så langt " + antallHybelmånederMedTommeHybler);
        skjerm.outln("Dette programmet har kjørt i " + (totaltAntallMåneder-2) + " måneder");

        } // End økonomirapport






} // End class Hybelhus