/*
 * Copyright (c) 2013, 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 test;

import jakarta.enterprise.context.ApplicationScoped;

/**
 * Validate the ISBN number as described in
 * http://en.wikipedia.org/wiki/International_Standard_Book_Number
 */
@ApplicationScoped
public class ISBNValidator {
    /**
     * For convenience, we will ignore '-', ' '.
     */
    public boolean isValid(String isbnStr) {
        char[] isbnChars = isbnStr.toCharArray();
        if (isbnChars.length < 10) {
            return false;
        }

        boolean valid = true;
        boolean hasX = false;
        int[] is = new int[13];
        int len = 0;
        // read one more if there is
        for (int i = 0; i < isbnChars.length && len < 14; i++) {
            char c = isbnChars[i];
            if ((c >= '0' && c <= '9')) {
                if (len < 13) {
                    is[len] = c - '0';
                }
                len++;
            } else if (c == '-' || c == ' ') {
                //skip
            } else if ((c == 'X' || c == 'x') && len == 9) { // for isbn 10
                is[len++] = 10;
                hasX = true;
            } else {
                valid = false;
                break;
            }
        }

        if (!valid || (len != 10 && len != 13) || (len != 10 && hasX)) {
            return false;
        }

        if (len == 10) {
            return isISBN10(is);
        } else { // len == 13
            return isISBN13(is);
        }
    }

    // only look at the first 10 elements and 'X' has changed to 10
    // 10x_1 + 9x_2 + 8x_3 + ... + 2x_9 + x_10 = 0 (mod 11)
    private boolean isISBN10(int[] is) {
        int sum = 0;
        for (int i = 0; i < 10; i++) {
            sum += (10 - i) * is[i];
        }
        return (sum % 11 == 0);
    }

    // x_13 = (10 - (x_1 + 3x_2 + x_3 + 3x_4 + ... + x_11 + 3x_12)) mod 10
    private boolean isISBN13(int[] is) {
        int sum = 0;
        for (int i = 0; i < 12; i += 2) {
            sum += is[i] + 3 * is[i + 1];
        }
        sum += is[12];
        return (sum % 10 == 0);
    }
}
