package resources;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Calculator resource exposed at '/calculator' path
 */
@Path("/calculator")
public class CalculatorResource {
/**
 * Method handling HTTP POST requests. The calculated answer to the expression will be sent to the client as
 * plain/text.
 *
 * @param expression the expression to be solved as plain/text.
 * @return solution to the expression as plain/text or -1 on error
 */
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
public int calculate(String expression) {
    // Removes all whitespaces
    String expressionTrimmed = expression.replaceAll("\\s+", "");

    int result = -1;

    /*
     * .matches use regex expression to decide if a String matches a given pattern.
     * [0-9]+[+][0-9]+ explained:
     * [0-9]+: a number from 0-9 one or more times. For example 1, 12 and 123.
     * [+]: the operator + one time.
     * The total regex expression accepts for example:
     * 12+34,
     * 1+2,
     * 10000+1000
     */

    if (expressionTrimmed.matches("^\\d+(?:\\s*[+]\\s*\\d+)*$")) result = sum(expressionTrimmed);
    else if (expressionTrimmed.matches("^\\d+(?:\\s*[-]\\s*\\d+)*$")) result = subtraction(expressionTrimmed);
    else if (expressionTrimmed.matches("^\\d+(?:\\s*[*]\\s*\\d+)*$")) result = multiplication(expressionTrimmed);
    else if (expressionTrimmed.matches("^\\d+(?:\\s*[/]\\s*\\d+)*$")) result = division(expressionTrimmed);

    return result;
}
//Multiplication
    public int multiplication(String equation) {
    String[] split = equation.split("[*]");
    int sum = Integer.parseInt(split[0]);
    try{
        for (int i = 1; i < split.length; i++) {
            if(!(split[i]).equals("0")) {
                sum *= Integer.parseInt(split[i]);
            }else throw new IllegalArgumentException(" Number can't be zero");
        }

        return sum;
        }catch(IllegalArgumentException e){
            e.printStackTrace();
    }return -1;

}

    public int division(String equation){
    String[] split = equation.split("[/]");
    try{
        int sum = Integer.parseInt(split[0]);
        for (int i = 1; i < split.length; i++) {
            if(!(split[i]).equals("0")){
                sum = Integer.parseInt(split[i]);
            }else throw new IllegalArgumentException("Number can't be zero");

        }

        return sum;
    }catch (IllegalArgumentException e){
        e.printStackTrace();
    }return -1;

}

    /**
     * Method used to calculate a sum expression.
     * @param expression the equation to be calculated as a String
     * @return the answer as an int
     */
    public int sum (String expression){
        String[] split = expression.split("[+]");
        int sum = Integer.parseInt(split[0]);
        for (int i = 1; i < split.length; i++) {
            sum += Integer.parseInt(split[i]);

        }

        return sum;
    }

    /**
     * Method used to calculate a subtraction expression.
     * @param expression the expression to be calculated as a String
     * @return the answer as an int
     */
    public int subtraction (String expression){
        String[] split = expression.split("[-]");
        int sum = Integer.parseInt(split[0]);
        for (int i = 1; i < split.length; i++) {
            sum -= Integer.parseInt(split[i]);
        }


        return sum;
    }
}