#include <unistd.h>

void    ft_putchar_nbr(int idx, char *ch_base)
{
        while (idx > 0)
        {
                write(1, &ch_base[idx - 1], 1);
                idx--;
        }
}

int     check_minus_nbr(int nbr, char *base)
{
        if (nbr < 0)
        {
                write(1, "-", 1);
                nbr *= -1;
        }
        else if (nbr == 0)
                write(1, base, 1);
        return (nbr);
}

int     check_base(char *base)
{
        int     idx;
        int     target;

        idx = 0;
        while (base[idx])
        {
                target = 0;
                if (base[idx] == '+' || base[idx] == '-') // +, - 기호 거름
                        return (0);
                else if (!(' ' <= base[idx] && base[idx] <= '~')) // 출력 가능한 경우
                        return (0);
                while (target < idx) // idx가 증가할 때마다 0부터 idx-1까지 중복 탐색
                {
                        if (base[target] == base[idx])
                                return (0);
                        target++;
                }
                idx++;
        }
        if (idx <= 1)
                return (0);
        return (1);
}

void    ft_putnbr_base(int nbr, char *base)
{
        int             base_rdx; // 진수 확인용 변수
        char    ch_base[200]; // nbr을 base를 밑으로 하는 진수 변환 후 담을 문자열
        int             idx;  // 인덱스 체크

        if (check_base(base)) // 예외 처리
        {
                base_rdx = 0;
                while (base[base_rdx]) // base_rdx의 크기 = 해당 진수의 크기
                        base_rdx++;
                idx = 0;
                if (nbr == -2147483648)
                {
                        ch_base[idx] = base[-(nbr % base_rdx)];
                        nbr = -(nbr / base_rdx); // -상태에서 나누고 양의 값을 씌움
	                      idx++;                   // int 타입 범위 제한 때문
                }
                nbr = check_minus_nbr(nbr, base); // nbr이 음수일 때와 0 처리
                while (nbr > 0)
                {
                        ch_base[idx] = base[nbr % base_rdx]; // 나머지를 차례로 넣음
                        nbr /= base_rdx; // 자릿수로 계속해서 나누어 준다.
                        idx++;
                }
                ft_putchar_nbr(idx, ch_base); // 역순으로 모두 출력
        }
}