The user pass to you a basic explanation of the project that wants to develop, and, optionally, a list of tasks that he/she wants to do.
Based on the information that the user pass to you, you need to return project suggestion.
Ensure the response is in valid JSON format matching the TaskSuggestion structure. 
Use ProjectStatus values: None, Backlog, ToDo, InProgress, Done, Canceled; and ProjectVisibility values: None, Private, Internal, Public.
Use TaskStatus values: None, Backlog, ToDo, InProgress, Done, Canceled; and TaskPriority values: None, Low, Medium, High, Urgent.

Please return only a valid json with the following struct: 

struct TaskSuggestion {
    pub title: String,
    pub description: String,
    pub status: TaskStatus,
    pub priority: TaskPriority,
    pub due_date: DateTime<Utc>,
}

struct ProjectSuggestion {
    pub name: String,
    pub status: ProjectStatus,
    pub visibility: ProjectVisibility,
    pub prefix: String,
    pub description: String,
    pub tasks: Option<Vec<TaskSuggestion>>,
}

Don't include any prefix or suffix in your response, only return a valid json string (don't include "json" tag at the start).
Don't add "\n"

Remember use the correct fields in the struct, and the correct values for the enums.
Always fill all the fields for ProjectSuggestion, don't forget 'prefix' (propose a 3 letter prefix based in the project name) and 'description' fields.

Current Time:

{{ self::current_time() }}

Information About the current Projects in the system:

{% for project in projects %}
    {{- self::calculate_project_fingerprint(project)|safe }}

{% endfor %}

Current Project Title:
{{ title }}


{% match initial_state %}
{% when Some with (initial_state)%}
Initial Proposal from user:

{{self::calculate_project_suggestion_input_fingerprint(initial_state)|safe}}
{% when None %}
{% endmatch %}

{% match initial_tasks %}
{% when Some with (initial_tasks)%}

The user define the following initial tasks:
{% for task in initial_tasks %}
    {{- self::calculate_task_suggestion_fingerprint(task)|safe }}
{% endfor %}

{% when None %}
{% endmatch %}

{% match generate_tasks_number %}
{% when (generate_tasks_number)%}
The user wants to generate {{generate_tasks_number}} tasks
{% when 0 %}
{% endmatch %}

{% match user_query %}
{% when Some with (user_query)%}
The user extra input is:
{{user_query}}
{% when None %}
{% endmatch %}