/*
 * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.acme;

import jakarta.ejb.*;
import jakarta.annotation.*;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import java.util.concurrent.*;

import com.sun.ejte.ccl.reporter.SimpleReporterAdapter;

import com.sun.enterprise.security.ee.auth.login.ProgrammaticLogin;

public class Client {

    private static SimpleReporterAdapter stat =
        new SimpleReporterAdapter("appserv-tests");

    private static String appName;
    private static String principal;

    @EJB static Hello hello;

    @Resource
    static FooManagedBean2 fooMb2;

    @Resource(lookup="java:module/FooManagedBean")
    static FooManagedBean fooMb;

    @Resource(lookup="java:comp/env/com.acme.Client/fooMb2")
    static FooManagedBean2 fooMb3;

    @Resource(lookup="java:module/ModuleName")
    static String moduleName;

    @Resource(lookup="java:app/AppName")
    static String appNameL;


    @EJB(lookup="java:app/env/forappclient")
    static Hello hello3;

    @EJB(mappedName="java:app/ejb-ejb31-security-simple-ejb/SingletonBean!com.acme.Hello")
    static Hello hello4;

    @EJB(name="java:app/env/appclientdefinedejbref1")
    static Hello hello5;

    @EJB(name="java:app/appclientdefinedejbref2")
    static Hello hello6;

    @EJB(name="java:global/appclientdefinedejbref3")
    static Hello hello7;

    @Resource(name="java:app/env/enventry1")
    static String envEntry1;

    @Resource(name="java:global/enventry2")
    static String envEntry2;

    @Resource(name="envEntry3")
    static Integer envEntry3;

    @Resource(name="envEntry4", lookup="java:app/env/value1")
    static Integer envEntry4;

    private static boolean appClient = false;

 @PostConstruct
    public static void init() {
        try {
            System.out.println("In init()");

            appClient = true;

            System.out.println("AppName = " + appNameL);
            System.out.println("ModuleName = " + moduleName);

            fooMb.hello();
            fooMb2.hello();
            fooMb3.hello();

            Integer envEntry = (Integer)
                new InitialContext().lookup("java:app/env/value1");
            System.out.println("java:app/env/value1 = " + envEntry);

            System.out.println("java:app/env/enventry1 = " + envEntry1);
            System.out.println("java:global/enventry2 = " + envEntry2);
            System.out.println("java:global/enventry3 = " + envEntry3);
            if( (envEntry3 == null) || envEntry3.intValue() != 18338 ) {
                throw new RuntimeException("invalid enventry3 value");
            }

            System.out.println("java:global/enventry4 = " + envEntry4);
            if( (envEntry4 == null) || envEntry4.intValue() != 18338 ) {
                throw new RuntimeException("invalid enventry4 value");
            }

            FooManagedBean fmbl = (FooManagedBean) new InitialContext().lookup("java:module/FooManagedBean");
            fmbl.hello();

             FooManagedBean fmbl2 = (FooManagedBean) new InitialContext().lookup("java:app/ejb-ejb31-security-simple-client/FooManagedBean");
            fmbl2.hello();

        } catch(NamingException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String args[]) {
        for (String arg : args) {
            System.out.println("Arg: " + arg);
        }
        appName = args[0];
        principal = args[1];
        stat.addDescription(appName);
        Client client = new Client(args);
        client.doTest();
        stat.printSummary(appName + "ID");
    }

    public Client(String[] args) {}

    public void doTest() {

        System.out.println("Executing test with user principal " + principal);
        boolean havePermission = principal.equals("bob");
        if( havePermission ) {
            System.out.println("Expecting permission to access protected methods");
        } else {
            System.out.println("NOT expecting permission to access protected methods");
        }


        String results;

        try {

            /**
            if( !appClient ) {
                System.out.println("In SE client.  Using programmatic login");
                ProgrammaticLogin pm = new ProgrammaticLogin();
                pm.login("mary", "mob", "default", true);
                System.out.println("Programmatic login succeeded");

            }
            */

            //            ProgrammaticLogin login = new com.sun.appserv.security.api.ProgrammaticLogin();

            if( hello == null ) {
                hello = (Hello) new InitialContext().lookup("java:global/ejb-ejb31-security-simpleApp/ejb-ejb31-security-simple-ejb/SingletonBean!com.acme.Hello");
            } else {
                // In an appclient.
                Hello hello2 = (Hello) new InitialContext().lookup("java:app/env/forappclient");
                System.out.println("java:app/env/forappclient lookup = " + hello2);
                System.out.println("hello3 = " + hello3);

                Hello hello5 = (Hello) new InitialContext().lookup("java:app/ejb-ejb31-security-simple-ejb/SingletonBean!com.acme.Hello");
                System.out.println("hello4 = " + hello4);
                System.out.println("hello5 = " + hello5);
                String env = (String) new InitialContext().lookup("java:app/enventryforappclient");
                System.out.println("java:app env entry = " + env);
            }

            boolean pass;

            try {
                hello.protectedSyncRemote();
                pass = havePermission;
            } catch(EJBAccessException e) {
                pass = !havePermission;
            }


            System.out.println("pass = " + pass);

            try {
                hello.unprotectedSyncRemote();
                pass = true;
            } catch(EJBAccessException e) {
                pass = false;
            }


            System.out.println("pass = " + pass);

            try {
                Future<Object> future = hello.protectedAsyncRemote();
                Object obj = future.get();
                pass = havePermission;

            } catch(ExecutionException ee) {
                if( ee.getCause() instanceof EJBAccessException ) {
                    pass = !havePermission;
                } else {
                    pass = false;
                }
            }


            System.out.println("pass = " + pass);


            try {
                Future<Object> future = hello.unprotectedAsyncRemote();
                Object obj = future.get();
                pass = true;
            } catch(ExecutionException ee) {
                pass = false;
            }



            System.out.println("pass = " + pass);


            try {
                hello.testProtectedSyncLocal();
                pass = havePermission;
            }  catch(EJBAccessException e) {
                pass = !havePermission;
            }



            System.out.println("pass = " + pass);


            try {
                hello.testUnprotectedSyncLocal();
                pass = true;
            }  catch(Exception e) {
                pass = false;
            }


            System.out.println("pass = " + pass);


            try {
                hello.testProtectedAsyncLocal();
                pass = havePermission;
            }  catch(EJBAccessException e) {
                pass = !havePermission;
            }



            System.out.println("pass = " + pass);

            try {
                hello.testUnprotectedAsyncLocal();
                pass = true;
            }  catch(Exception e) {
                pass = false;
            }

            System.out.println("pass = " + pass);

            stat.addStatus("local main", stat.PASS);

        } catch(NamingException ne) {

            if( appClient ) {
                stat.addStatus("local main", stat.FAIL);
            } else {
                System.out.println("Got expected security failure during lookup for non-authenticated SE client");
                stat.addStatus("local main", stat.PASS);
            }

        } catch(Exception e) {
            stat.addStatus("local main", stat.FAIL);
            e.printStackTrace();
        }
    }


}
