
import post.mail.Letter;
import post.mail.Address;
import post.Postman;
import post.office.OfficeTest;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

public class Test {

    private static Address addr, recipient;

    private static final PrintWriter stdout = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true);
    private static final PrintWriter stderr = new PrintWriter(new OutputStreamWriter(System.err, StandardCharsets.UTF_8), true);

    public static void main(String[] args) {
        try {
            stdout.print("Address tesztelése... ");
            testAddress();
            stdout.println("kész");
            stdout.print("Letter tesztelése... ");
            testLetter();
            stdout.println("kész");
            stdout.print("Postman tesztelése... ");
            testPostman();
            stdout.println("kész");
            stdout.print("Municipal tesztelése... ");
            OfficeTest.testMunicipal();
            stdout.println("kész");
            stdout.print("National tesztelése... ");
            OfficeTest.testNational();
            stdout.println("kész");
        } catch (Exception e) {
            stdout.println();
            stdout.println(e);
            System.exit(1);
        }
    }

    private static void testAddress() {
        addr = new Address("Egyesült Királyság", "London", "Baker Street", (short) 221);

        assertEquals("Az Address getCountry() nem az országnevet adta vissza.", "Egyesült Királyság", addr.getCountry());
        assertEquals("Az Address getCity() nem a városnevet adta vissza.", "London", addr.getCity());
        assertEquals("Az Address getStreet() nem az utcanevet adta vissza.", "Baker Street", addr.getStreet());
        assertEquals("Az Address getNumber() nem a házszámot adta vissza.", (short) 221, addr.getNumber());
    }

    private static void testLetter() {
        recipient = new Address("Magyarország", "Budapest", "Pázmány Péter sétány", (short) 1);
        Letter lettr = new Letter(addr, recipient, "Elementary!");

        assertFalse("A Letter isReturningToSender() metódusa kezdetben igaz értéket adott vissza.", lettr.isReturningToSender());
        assertFalse("A Letter isDestoryed() metódusa kezdetben igaz értéket adott vissza.", lettr.isDestroyed());
        assertFalse("A Letter isDelivered() metódusa kezdetben igaz értéket adott vissza.", lettr.isDelivered());

        assertEquals("A Letter whereToDeliver() metódusa kezdetben nem az eredeti címzettet adja vissza.", recipient.getCountry(), lettr.whereToDeliver().getCountry());
        lettr.backToSender();

        assertEquals("A Letter whereToDeliver() metódusa kezdetben nem az eredeti feladót adja vissza, ha rossz volt a címzett címe.", addr.getCountry(), lettr.whereToDeliver().getCountry());

        lettr.delivered();
        assertTrue("A Letter isDelivered() metódusa kézbesítés után hamis értéket adott vissza.", lettr.isDelivered());

        lettr.destroy();
        assertTrue("A Letter isDestroyed() metódusa megsemmisítés után hamis értéket adott vissza.", lettr.isDestroyed());
    }

    private static void testPostman() {
        Postman postman = new Postman("Pázmány Péter sétány", 17, 10);

        Address recA, recB, recC, recD;
        String country = "Magyarország";
        String city = "Budapest";
        String str = "Pázmány Péter sétány";
        recA = new Address(country, city, str, (short) 10);
        recB = new Address(country, city, str, (short) 12);
        recC = new Address(country, city, str, (short) 17);
        recD = new Address(country, city, str, (short) 19);

        assertTrue("A Postman deliver() metódusa hamisat adott vissza létező páros házszámra.", postman.deliver(new Letter(addr, recA, "")));
        assertFalse("A Postman deliver() metódusa igazat adott vissza nem létező páros házszámra.", postman.deliver(new Letter(addr, recB, "")));
        assertTrue("A Postman deliver() metódusa hamisat adott vissza létező páratlan házszámra.", postman.deliver(new Letter(addr, recC, "")));
        assertFalse("A Postman deliver() metódusa igazat adott vissza nem létező páratlan házszámra.", postman.deliver(new Letter(addr, recD, "")));
    }

    public static void assertTrue(String msg, Boolean b) {
        if (!b) {
            stderr.println("HIBA: " + msg);
            //System.exit(1);
        }
    }

    public static void assertFalse(String msg, Boolean b) {
        if (b) {
            stderr.println("HIBA: " + msg);
            //System.exit(1);
        }
    }

    public static void assertEquals(String msg, Object a, Object b) {
        if (!a.equals(b)) {
            stderr.println("HIBA: " + msg + ": '" + a.toString() + "' /= '" + b.toString() + "'");
            //System.exit(1);
        }
    }
}
