{%- from tpldir ~ "/map.jinja" import mysql with context %}

{%- set mysql_root_user = salt['pillar.get']('mysql:server:root_user', 'root') %}
{%- set mysql_root_pass = salt['pillar.get']('mysql:server:root_password', salt['grains.get']('server_id')) %}
{%- set mysql_host = salt['pillar.get']('mysql:server:host', 'localhost') %}
{%- set db_states = [] %}

{%- set mysql_salt_user = salt['pillar.get']('mysql:salt_user:salt_user_name', mysql_root_user) %}
{%- set mysql_salt_pass = salt['pillar.get']('mysql:salt_user:salt_user_password', mysql_root_pass) %}

include:
  - .python

{%- for database_obj in salt['pillar.get']('mysql:database', []) %}
{%- set state_id = 'mysql_db_' ~ loop.index0 %}
{%- if not database_obj %}{# in case database_obj == [] #}
{%-   continue %}
{%- elif database_obj is mapping %}
{%-   set database = database_obj.get('name') %}
{%-   set present = database_obj.get('present', True) %}
{%- else %}
{%-   set database = database_obj %}
{%-   set present = True %}
{%- endif %}
{{ state_id }}:
  {%- if present %}
  mysql_database.present:
    {%- if database_obj is mapping %}
    - character_set: {{ database_obj.get('character_set', '') }}
    - collate: {{ database_obj.get('collate', '') }}
    {%- endif %}
  {%- else %}
  mysql_database.absent:
  {%- endif %}
    - name: {{ database }}
    - connection_host: '{{ mysql_host }}'
    - connection_user: '{{ mysql_salt_user }}'
    {%- if mysql_salt_pass %}
    - connection_pass: '{{ mysql_salt_pass }}'
    {%- endif %}
    - connection_charset: utf8

{%- if salt['pillar.get'](['mysql', 'schema', database, 'load']|join(':'), False) %}
{{ state_id }}_schema:
  file.managed:
    - name: /etc/mysql/{{ database }}.schema
    - source: {{ salt['pillar.get'](['mysql', 'schema', database, 'source']|join(':')) }}
{%- set template_type = salt['pillar.get'](['mysql', 'schema', database, 'template']|join(':'), False) %}
{%- set template_context = salt['pillar.get'](['mysql', 'schema', database, 'context']|join(':'), {}) %}
{%- if template_type %}
    - template: {{ template_type }}
    - context: {{ template_context|yaml }}
{%- endif %}
    - user: {{ salt['pillar.get']('mysql:server:user', 'mysql') }}
    - makedirs: True

{{ state_id }}_load:
  cmd.wait:
    - name: mysql -u {{ mysql_salt_user }} -h{{ mysql_host }} {% if mysql_salt_pass %}-p{%- endif %}{{ mysql_salt_pass }} {{ database }} < /etc/mysql/{{ database }}.schema
    - watch:
      - file: {{ state_id }}_schema
      - mysql_database: {{ state_id }}
{%- endif %}

{%- do db_states.append(state_id) %}
{%- endfor %}