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



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

import java.util.regex.Pattern;

public class Solution {
    private static final String HEX = "0123456789abcdef";

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

    public static String toHex(String binaryNumber) {
        if (binaryNumber == null || binaryNumber.equals("") || !isBin(binaryNumber)) return "";
        for (int i = 0; i < (binaryNumber.length() % 4); i++) {
            binaryNumber = "0" + binaryNumber;
        }
        if (binaryNumber.equals("0000")) return "0";
        return decToHex(binToDecimal(binaryNumber));
    }


    public static String toBinary(String hexNumber) {
        if (hexNumber == null || hexNumber.equals("") || !isHex(hexNumber)) return "";
        if (hexNumber.equals("0")) return "0";
        return decToBinary(hexToDecimal(hexNumber));
    }


    public static int binToDecimal(String binaryNumber) {
        int num = 0, n = 0;
        if (binaryNumber == null || binaryNumber.equals("")) return 0;
        for (int i = 0; i < binaryNumber.length(); i++) {
            n = binaryNumber.charAt(binaryNumber.length() - i - 1) == '1' ? (int) Math.pow(2, i) : 0;
            num = num + n;
        }
        return num;
    }

    public static String decToBinary(int decimalNumber) {
        String bin_str = "";
        if (decimalNumber == 0) return "0";
        while (decimalNumber > 0) {
            bin_str = String.valueOf((decimalNumber % 2)) + bin_str;
            decimalNumber = decimalNumber / 2;
        }
        return bin_str;
    }

    public static String decToHex(int decimalNumber) {
        //напишите тут ваш код
        String hex_num = "";
        if (decimalNumber == 0) return "0";
        while (decimalNumber != 0) {

            hex_num = HEX.charAt(decimalNumber % 16) + hex_num;
            decimalNumber = decimalNumber / 16;
        }
        return hex_num;
    }

    public static int hexToDecimal(String hexNumber) {
        if (hexNumber == null || hexNumber.equals("")) return -1;
        int index = 0;
        int num = 0;
        for (int i = 0; i < hexNumber.length(); i++) {
            for (int j = 0; j < HEX.length(); j++) {
                if (hexNumber.charAt(hexNumber.length() - i - 1) == HEX.charAt(j)) {
                    index = j;
                    break;
                }
            }
            num = num + index * (int) Math.pow(16, i);
        }
        return num;
    }

    public static boolean isBin(String binNumber) {
        int n = 0;
        for (int i = 0; i < binNumber.length(); i++) {
            n = (int) binNumber.charAt(i);
            if (n < 48 || n > 49) return false;
        }
        return true;
    }

    public static boolean isHex(String hexNumber) {
        int n = 0;
        for (int i = 0; i < hexNumber.length(); i++) {
            n = (int) hexNumber.charAt(i);
            if (!((n >= 48 && n <= 57) || (n >= 97 && n <= 102))) return false;
        }
        return true;
    }
}