package com.javarush.task.pro.task09.task0908;

import java.util.Arrays;
import java.util.regex.Pattern;

/*
Двоично-шестнадцатеричный конвертер
*/

public class Solution {

    public static void main(String[] args) {
        String binaryNumber = "10101010";
        System.out.println("Двоичное число " + binaryNumber + " равно шестнадцатеричному числу " + toHex(binaryNumber));
        String hexNumber = "aa";
        System.out.println("Шестнадцатеричное число " + hexNumber + " равно двоичному числу " + toBinary(hexNumber));
    }


    public static String toHex(String binaryNumber) {
        String[] arrHex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
        String[] arrBin = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
        StringBuilder result = new StringBuilder();
        if (binaryNumber == null || binaryNumber.equals("") || !binaryNumber.matches("[01]+")) {
            return result.toString();
        } else {
            if (binaryNumber.length() % 4 == 0) {
                int length = binaryNumber.length();
                int index = length / 4;
                for (int i = 0; i < index; i++) {
                    int elementIndex;
                    String partOfBinaryNumber = binaryNumber.substring(0, 4);

                    for (int j = 0; j < arrBin.length; j++) {
                        if (arrBin[j].equals(partOfBinaryNumber)) {
                            elementIndex = j;
                            result.append(arrHex[elementIndex]);
                            break;
                        }
                    }
                    binaryNumber = binaryNumber.substring(4);
                }
            } else {
                int x = 4 - binaryNumber.length() % 4;
                for (int i = 0; i < x; i++) {
                    binaryNumber = "0" + binaryNumber;
                }
                return toHex(binaryNumber);
            }
            return result.toString();
        }
    }




    public static String toBinary(String hexNumber) {
        String[] arrHex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
        String[] arrBin = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
        StringBuilder result = new StringBuilder();
        if (hexNumber == null || hexNumber.equals("") || !hexNumber.matches("[0-9,a-f]+")) {
            return result.toString();
        } else {
            for (int i = 0; i < hexNumber.length(); i++) {
                String s = hexNumber.substring(i, i+1);
                for (int j = 0; j < arrHex.length - 1; j++) {
                    if (s.equals(arrHex[j])) {
                        result.append(arrBin[j]);
                        break;
                    }
                }
            }
        }
            return result.toString();
        }
    }