# your code goes here

import sre_parse
import pprint
import random


class RandomRegexStringGenerator:
    def __init__(self):
        self._words = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
        self._digits = '0123456789'
        self._whitespaces = ' \t'  #  ' \t\n\r\v\f' 에서 조정
        self._max_repeat = 5 # 무한 수량자가 나왔을때 최대 반복 리밋

        self._result = ''

    def _gen_char(self, value):
        return chr(value)

    def _gen_range(self, min_value, max_value):
        # random 선택
        idx = random.randint(min_value, max_value)
        return chr(idx)

    def _gen_in_word(self):
        return self._words[random.randint(0, len(self._words)-1)]

    def _gen_in_digit(self):
        return self._digits[random.randint(0, len(self._digits)-1)]

    def _gen_in_whitespace(self):
        return self._whitespaces[random.randint(0, len(self._whitespaces)-1)]


    def _proc_cmd(self, itm):
        # 단문자
        if itm[0] == sre_parse.LITERAL:
            self._result += self._gen_char(itm[1])

        # 문자클래스
        elif itm[0] == sre_parse.IN:
            start_num = 0
            body = itm[1]
            if body[0][0] == sre_parse.NEGATE: # 제외조건 TODO:
                start_num = 1
            
            # random 선택
            idx = random.randint(start_num, len(body)-1)
            cls_itm = body[idx]

            if cls_itm[0] == sre_parse.LITERAL:
                self._result += self._gen_char(cls_itm[1])

            elif cls_itm[0] == sre_parse.RANGE:
                self._result += self._gen_range(cls_itm[1][0], cls_itm[1][1])
                
            elif cls_itm[0] == sre_parse.CATEGORY:
                if cls_itm[1] == sre_parse.CATEGORY_DIGIT:
                    self._result += self._gen_in_digit()
                    
                elif cls_itm[1] == sre_parse.CATEGORY_WORD:
                    self._result += self._gen_in_word()
                    
                elif cls_itm[1] == sre_parse.CATEGORY_SPACE:
                    self._result += self._gen_in_whitespace()
                # TODO: NOT CATEGORY 처리해야함..
                    
        # 수량자
        elif itm[0] in (sre_parse.MAX_REPEAT, sre_parse.MIN_REPEAT):
            # 패턴 => XXX_REPEAT, (min, max, p)                 
            min_repeat = itm[1][0] 
            max_repeat = itm[1][1]
            # set limit
            if itm[1][1] == sre_parse.MAXREPEAT:
                max_repeat = self._max_repeat  # 지정한 max값으로 한정
            
            # random 선택
            rand_repeat = random.randint(min_repeat, max_repeat)

            # random 만큼 반복
            for i in range(rand_repeat):
                self._read_body(itm[1][2])
        
        # Union
        elif itm[0] == sre_parse.BRANCH:
            body = itm[1][1]
            # random 선택
            idx = random.randint(0, len(body)-1)
            self._read_body(body[idx])

        else:            
            if isinstance(itm[1], tuple):
                for titm in itm[1]:
                    if isinstance(titm, sre_parse.SubPattern):
                        #print('CMD: %s in body '%(itm[0]))
                        self._read_body(titm)

    # [ (cmd), (cmd), ...] 이런 형태에 대해 cmd 마다 처리
    def _read_body(self, body):
        for itm in body:
            self._proc_cmd(itm)


    def generate(self, regex_pattern):

        p = sre_parse.parse( regex_pattern )
        #pprint.pprint(p)

        self._result = ''
        self._read_body( p )

        return self._result





pat = r'01[069]-\d\d\d\d?(-\d\d\d\d){2}'

g = RandomRegexStringGenerator()

for i in range(10):
    rstr = g.generate( pat )
    print( rstr )

