import os
import textwrap
from pydiscourse import DiscourseClient
from pydiscourse.exceptions import DiscourseClientError
[docs]class DiscourseFeatureTopicTemplate(object):
    indent = "    "
    bullet = " * "
    def __init__(self):
        self.title = "[New Feature] {title}"
        self.header = "## A new feature was submitted!\n\n"
        self.problem_name = "* _Problem name_: {problem_name}\n"
        self.feature_description = "* _Feature description_: {feature_description}\n"
        self.feature_code = "* _Feature code_:\n\n{feature_code}\n\n"
        self.feature_metrics = "* _Feature metrics_:\n{feature_metrics}\n\n"
        self.prompt = ("What do you think? What do you like about this "
                       "feature? How could it be improved? Leave your "
                       "comments below, or get to work with your ideas!\n\n")
        self.author = ("----------\n\n"
                      "(submitted by user <em>{user_name}</em>)\n")
[docs]    def render(self, problem_name, feature_description, feature_code,
            feature_metrics, user_name):
        result = ""
        result += self.header
        result += self.problem_name.format(
                problem_name=problem_name)
        result += self.feature_description.format(
                feature_description=feature_description)
        result += self.feature_code.format(
                feature_code=feature_code)
        result += self.prompt
        result += self.author.format(
                user_name=user_name)
        return result 
[docs]    def render_title(self, title):
        return self.title.format(title=title)  
[docs]class DiscourseFeatureTopic(object):
    def __init__(self, feature, metrics):
        self.feature = feature
        self.metrics = metrics
        client = DiscourseClient(
                host="https://{}".format(os.environ.get("DISCOURSE_DOMAIN_NAME")),
                api_username=os.environ.get("DISCOURSE_CLIENT_API_USERNAME"),
                api_key=os.environ.get("DISCOURSE_CLIENT_API_TOKEN"))
        self.client = client
[docs]    def get_params(self):
        params = [
            self.feature.problem.name,
            self.feature.description,
            self.format_code(),
            self.format_metrics(),
            self.feature.user.name,
        ]
        return params 
[docs]    def post_feature(self):
        params = self.get_params()
        content = DiscourseFeatureTopicTemplate().render(*params)
        try:
            post = self.client.create_post(
                    category=os.environ.get("DISCOURSE_FEATURE_CATEGORY_NAME"),
                    title=format(self.feature.description),
                    content=content)
            # return the url of the new post
            url = "https://{}/t/{}".format(
                    os.environ.get("DISCOURSE_DOMAIN_NAME"),
                    post["topic_slug"])
        except Exception as err:
            # TODO
            url = ""
            raise err
        return url  
def _escape_user_name(name):
    """Replace `_` in name with `_`."""
    return name.replace("_", "_")