/*
 * 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 endpoint;

import jakarta.jws.WebService;
import jakarta.jws.WebMethod;
import jakarta.jws.*;
import jakarta.jws.soap.SOAPBinding;
import common.IncomeTaxDetails;

@WebService(
        name="Calculator",
        serviceName="CalculatorService",
        targetNamespace="http://example.web.service/Calculator",
                wsdlLocation = "WEB-INF/wsdl/CalculatorService.wsdl"
        )
@SOAPBinding(style=SOAPBinding.Style.RPC, use=SOAPBinding.Use.LITERAL)

public class Calculator {

        public static final String testName = "\nTest :: rpc-literal-bundled-wsdl : ";
    public Calculator() {}

    @WebMethod(operationName="add", action="urn:Add")
    public int add(
            @WebParam(name = "int_1", partName = "int_1") int i,
            @WebParam(name = "int_2", partName = "int_2") int j
            ) throws Exception {
        int k = i +j ;
        System.out.println(testName + i + "+" + j +" = " + k);
        return k;
    }

        @WebMethod(operationName="calculateIncomeTax", action="urn:CalculateIncomeTax")
        public long calculateIncomeTax(IncomeTaxDetails details
                         , IncomeTaxDetails details2
                         , IncomeTaxDetails details3
                         , IncomeTaxDetails details4
                         , IncomeTaxDetails details5
                         , IncomeTaxDetails details6
                         , IncomeTaxDetails details7
                         , IncomeTaxDetails details8
                         , IncomeTaxDetails details9
                         , IncomeTaxDetails details10
                        ) {
                long income = details.annualIncome;
                System.out.println(testName + "Annual income = " + income);
                long taxRate = 30; // 30%
                long taxToBePaid = income / taxRate;
                System.out.println(testName +"Tax to be paid = " + taxToBePaid);
                return taxToBePaid;
        }

        @WebMethod(operationName="sayHi", action="urn:SayHi")
        public String sayHi() {
                return testName + "Hi from sayHi()";
        }

        @WebMethod(operationName="printHi", action="urn:PrintHi")
        public void printHi() {
                System.out.println(testName +"Hi from printHi()");
        }

        @WebMethod(operationName="printHiToMe", action="urn:PrintHiToMe")
        public void printHiToMe(String name) {
                System.out.println(testName +"Hi to " + name + " from printHiToMe()");
        }
}
