import sublime
import sublime_plugin

import random
import re

class RandomizeCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        selection = self.view.sel()
        for region in selection:
            region_text = self.view.substr(region)
            randomized_text = self.randomize_text(region_text)
            self.view.replace(edit, region, randomized_text)

    def is_enabled(self):
        return len(self.view.sel()) > 0

    def randomize_text(self, text):
        number_re = re.compile('\d')
        alpha_capital_re = re.compile('[A-Z]')
        alpha_lower_case_re = re.compile('[a-z]')

        randomized_chars = []
        skip_next = False
        for i in range(len(text)):
            char = text[i]
            if skip_next:
                randomized_chars.append(char)
                skip_next = False
            elif char == '\\':
                # Let's leave escaped characters as they are.
                randomized_chars.append(char)
                skip_next = True
            elif number_re.match(char):
                randomized_chars.append(str(random.randint(0, 9)))
            elif alpha_capital_re.match(char):
                randomized_chars.append(chr(random.randint(65, 90)))
            elif alpha_lower_case_re.match(char):
                randomized_chars.append(chr(random.randint(97, 122)))
            else:
                # This works, but might be a little too much.
                # randomized_chars.append(self.random_special_char())
                randomized_chars.append(char)

        return ''.join(randomized_chars)

    def random_special_char(self):
        range = [
          [33, 47],
          [58, 64],
          [91, 96],
          [123, 126]
        ][random.randint(0, 3)]

        return chr(random.randint(range[0], range[1]))