#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#include <string.h>

int main()
{
    // Zona de variables
    int salir = 0, opcion, resto;
    long decimal, original;
    int bits[64]; // Hasta 64 bits
    char hexbits[64];
    char binario[65], octal[65], hexadecimal[65]; // 64 bits + '\0'
    int i = 0;
    // Establecer locale a UTF-8
    setlocale(LC_ALL, ".UTF-8");

    // Cambia la consola a UTF-8 para entrada y salida
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);
    // Grueso del programa
    printf("CONVERSOR DECIMAL - BINARIO - OCTAL - HEXADECIMAL\n");
    do
    {
        // Limpieza de pantalla
        system("cls");
        printf("\n---------------- MENÚ ----------------");
        printf("\n\t0) Salir.");
        printf("\n\t1) Convertir decimal a binario.");
        printf("\n\t2) Convertir decimal a octal.");
        printf("\n\t3) Convertir decimal a hexadecimal.");
        printf("\n--------------------------------------");
        printf("\nElija una opción: ");
        scanf("%d", &opcion);
        while (getchar() != '\n')
            ; // Limpieza de buffer
        switch (opcion)
        {
        case 0:
            printf("\nVa a abandonar el programa. Pulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            salir = 1;
            break;
        case 1:
            printf("\nVa a convertir un número en binario. Pulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            printf("\nIntroduzca un número en sistema decimal (cifras del 0 al 9): ");
            scanf("%ld", &decimal);

            // Limpiar buffer
            while (getchar() != '\n')
                ;

            original = decimal; // Guardamos el valor original

            printf("Convirtiendo decimal a binario...\n");
            system("timeout /t 2 > nul");

            // Caso especial: si el número es 0
            if (decimal == 0)
            {
                printf("\nRESULTADO:");
                printf("\n%ld(10 = 0(2\n", original);
                return 0;
            }

            // Convertimos a binario

            binario[0] = '\0'; // 🔥 LIMPIAR CADENA
            int i = 0;
            do
            {
                bits[i] = decimal % 2;
                decimal /= 2;
                i++;
            } while (decimal != 0 && i < 64);

            // Construimos la cadena binaria en orden inverso
            int j;
            for (j = 0; j < i; j++)
            {
                binario[j] = bits[i - j - 1] + '0';
            }

            binario[i] = '\0'; // Terminador de cadena

            printf("\nRESULTADO:");
            printf("\n%ld(10 = %s(2\n", original, binario);

            printf("\nPulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            break;
        case 2:
            printf("\nVa a convertir un número en octal. Pulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            printf("\nIntroduzca un número en sistema decimal (cifras del 0 al 9): ");
            scanf("%ld", &decimal);

            // Limpiar buffer
            while (getchar() != '\n')
                ;

            original = decimal; // Guardamos el valor original

            printf("Convirtiendo decimal a octal...\n");
            system("timeout /t 2 > nul");

            // Caso especial: si el número es 0
            if (decimal == 0)
            {
                printf("\nRESULTADO:");
                printf("\n%ld(10 = 0(8\n", original);
                return 0;
            }

            // Convertimos a octal

            octal[0] = '\0'; // 🔥 LIMPIAR CADENA
            i = 0;
            do
            {
                bits[i] = decimal % 8;
                decimal /= 8;
                i++;
            } while (decimal != 0 && i < 64);

            // Construimos la cadena octal en orden inverso
            for (j = 0; j < i; j++)
            {
                octal[j] = bits[i - j - 1] + '0';
            }

            octal[i] = '\0'; // Terminador de cadena

            printf("\nRESULTADO:");
            printf("\n%ld(10 = %s(8\n", original, octal);

            printf("\nPulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            octal[0] = '\0';
            break;
        case 3:
            printf("\nVa a convertir un número en hexadecimal. Pulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            printf("\nIntroduzca un número en sistema decimal (cifras del 0 al 9): ");
            scanf("%ld", &decimal);

            // Limpiar buffer
            while (getchar() != '\n')
                ;

            original = decimal; // Guardamos el valor original

            printf("Convirtiendo decimal a hexadecimal...\n");
            system("timeout /t 2 > nul");

            // Caso especial: si el número es 0
            if (decimal == 0)
            {
                printf("\nRESULTADO:");
                printf("\n%ld(10 = 0(16\n", original);
                return 0;
            }

            // Convertimos a hexadecimal

            hexadecimal[0] = '\0'; // 🔥 LIMPIAR CADENA
            i = 0;

            do
            {
                int resto = decimal % 16;

                if (resto < 10)
                {
                    hexbits[i] = resto + '0';
                }
                else
                {
                    hexbits[i] = resto - 10 + 'A';
                }
                decimal /= 16;
                i++;

            } while (decimal != 0 && i < 64);

            for (j = 0; j < i; j++)
            {
                hexadecimal[j] = hexbits[i - j - 1];
            }

            hexadecimal[i] = '\0'; // Terminador de cadena

            printf("\nRESULTADO:");
            printf("\n%ld(10 = %s(16\n", original, hexadecimal);

            printf("\nPulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
            break;
        default:
            printf("\nOpción no válida. Pulse INTRO para continuar...");
            while (getchar() != '\n')
                ;
        }
    } while (salir == 0);
    printf("\nPrograma terminado.\n");
    // Salida OK
    return 0;
}