package com.ningdatech.carapi.car.vehicle.utils;

import java.util.HashMap;
import java.util.Map;

public class VinUtils {
    public static Map<Character,Integer> kv = new HashMap<>();

    public static Map<Integer,Integer> wv = new HashMap<>();

    static{
        kv.put('a',1);
        kv.put('b', 2);
        kv.put('c', 3);
        kv.put('d', 4);
        kv.put('e', 5);
        kv.put('f', 6);
        kv.put('g', 7);
        kv.put('h', 8);
        kv.put('j', 1);
        kv.put('k', 2);
        kv.put('l', 3);
        kv.put('m', 4);
        kv.put('n', 5);
        kv.put('p', 7);
        kv.put('q', 8);
        kv.put('r', 9);
        kv.put('s', 2);
        kv.put('t', 3);
        kv.put('u', 4);
        kv.put('v', 5);
        kv.put('w', 6);
        kv.put('x', 7);
        kv.put('y', 8);
        kv.put('z', 9);
        kv.put('0',0);
        kv.put('1',1);
        kv.put('2',2);
        kv.put('3',4);
        kv.put('4',4);
        kv.put('5',5);
        kv.put('6',6);
        kv.put('7',7);
        kv.put('8',8);
        kv.put('9',9);

        wv.put(1, 8);
        wv.put(2, 7);
        wv.put(3, 6);
        wv.put(4, 5);
        wv.put(5, 4);
        wv.put(6, 3);
        wv.put(7, 2);
        wv.put(8, 10);
        wv.put(10, 9);
        wv.put(11, 8);
        wv.put(12, 7);
        wv.put(13, 6);
        wv.put(14, 5);
        wv.put(15, 4);
        wv.put(16, 3);
        wv.put(17, 2);
    };

    public final static boolean isLegal(String vin) {
        if (vin == null) {
            return false;
        } else if (vin.trim().length() == 17) {
            vin = vin.trim().toLowerCase();
            char[] codes = vin.toCharArray();
            int resultInCode = 0;
            if ("0123456789".contains(vin.subSequence(8, 9))) {
                resultInCode = Integer.valueOf(vin.subSequence(8, 9).toString());
            } else {
                return false;
            }
            int total = 0;
            for (int i = 1; i < codes.length + 1; i++) {
                char code = codes[i - 1];
                if (kv.containsKey(code)) {
                    if (i == 9) {
                        continue;
                    } else {
                        total += kv.get(code) * wv.get(i);
                    }
                } else {
                    return false;
                }
            }
            return resultInCode == total % 11;
        } else {
            return false;
        }
    }
}
