---
- hosts: radon.n39.eu
  become: true

  vars:
    ansible_python_interpreter: /usr/bin/python3

    data_dir: "/srv/data"

    mosquitto_image: eclipse-mosquitto:2.0.14
    mosquitto_data: "{{ data_dir }}/mosquitto"

    nodered_image: nodered/node-red:3.0.1-1-18
    nodered_data: "{{ data_dir }}/nodered"

    rabbitmq_image: "bitnami/rabbitmq:3.10.7"
    rabbitmq_data: "{{ data_dir }}/rabbitmq"

    pwr_meter_pulse_gw_image: "netz39/power-meter-pulse-gateway:0.3.0"

    brotherql_host_port: 9004
    brotherql_web_image: "pklaus/brother_ql_web:alpine_9e20b6d"

  roles:
    # role 'docker_setup' applied through group 'docker_host'
    - role: apache
    - role: apache_letsencrypt  # Uses configuration from dehydrated setup
    - role: ansible-role-dehydrated
      vars:
        dehydrated_contact_email: "{{ server_admin }}"
        dehydrated_domains:
          - name: nodered.n39.eu
          - name: rabbitmq.n39.eu
          - name: pwr-meter-pulse-gw-19i.svc.n39.eu
          - name: labelprinter.n39.eu
    - role: penguineer.dehydrated_cron


  tasks:
    - name: Ensure the mosquitto directories exist
      file:
        path: "{{ item }}"
        mode: 0755
        state: directory
      with_items:
        - "{{ mosquitto_data }}/config"
        - "{{ mosquitto_data }}/data"
        - "{{ mosquitto_data }}/log"

    - name: Make sure mosquitto config is there
      template:
        src: "templates/mosquitto.conf.j2"
        dest: "{{ mosquitto_data }}/config/mosquitto.conf"
        mode: 0644
      notify: restart mosquitto

    - name: Ensure mosquitto is running
      docker_container:
        name: mosquitto
        image: "{{ mosquitto_image }}"
        pull: true
        state: started
        ports:
          - 1883:1883
          - 9001:9001
        volumes:
          - "{{ mosquitto_data }}/config:/mosquitto/config"
          - "{{ mosquitto_data }}/data:/mosquitto/data"
          - "{{ mosquitto_data }}/log:/mosquitto/log"
        detach: yes
        keep_volumes: yes
        restart_policy: unless-stopped
        env:
          TZ: "{{ timezone }}"

    - name: Check if nodered data dir exists
      ansible.builtin.stat:
        path: "{{ data_dir }}/nodered"
      register: nodered_dir
    - name: Fail if nodered data dir does not exist
      ansible.builtin.fail:
        msg: "Nodered data dir is missing, please restore from the backup!"
      when: not nodered_dir.stat.exists

    - name: Ensure nodered is running
      docker_container:
        name: nodered
        image: "{{ nodered_image }}"
        pull: true
        state: started
        env:
          TZ: "{{ timezone }}"
          NODE_RED_ENABLE_PROJECTS: "true"
        ports:
          - 127.0.0.1:9002:1880
        volumes:
          - "{{ nodered_data }}/data:/data"
          # Mount the .ssh/known_hosts, otherwise the host must be confirmed
          # (via docker exec) every time the container is updated.
          - "{{ nodered_data }}/known_hosts:/usr/src/node-red/.ssh/known_hosts:rw"
        detach: yes
        keep_volumes: yes
        restart_policy: unless-stopped

    - name: Setup proxy site nodered.n39.eu
      include_role:
        name: setup_http_site_proxy
      vars:
        site_name: "nodered.n39.eu"
        proxy_port: 9002


    - name: Check if rabbitmq data dir exists
      ansible.builtin.stat:
        path: "{{ rabbitmq_data }}"
      register: rabbitmq_dir
    - name: Fail if rabbitmq data dir does not exist
      ansible.builtin.fail:
        msg: "RabbitMQ data dir is missing, please restore from the backup!"
      when: not rabbitmq_dir.stat.exists

    - name: Ensure rabbitmq docker container is running
      docker_container:
        name: rabbitmq
        image: "{{ rabbitmq_image }}"
        ports:
          - 4369:4369
          - 5551:5551
          - 5552:5552
          - 5672:5672
          - 25672:25672
          - 127.0.0.1:15672:15672
        env:
          TZ: "{{ timezone }}"
          RABBITMQ_SECURE_PASSWORD: "yes"
        volumes:
          - "{{ rabbitmq_data }}/bitnami:/bitnami:rw"
          - "{{ rabbitmq_data }}/etc_rabbitmq:/etc/rabbitmq:rw"
        restart_policy: unless-stopped

    - name: Setup proxy site rabbitmq.n39.eu
      include_role:
        name: setup_http_site_proxy
      vars:
        site_name: "rabbitmq.n39.eu"
        proxy_port: 15672


    - name: Ensure Power Meter Pulse Gateway for 19i room is running
      docker_container:
        name: pwr-meter-pulse-gw-19i
        image: "{{ pwr_meter_pulse_gw_image }}"
        ports:
#          Wait for https://redmine.n39.eu/issues/755
#          - 127.0.0.1:9003:8080
          - 9003:8080
        env:
          TZ: "{{ timezone }}"
          AMQP_HOST: "rabbitmq.n39.eu"
          AMQP_USER: "{{ pwr_meter_amqp_user }}"
          AMQP_PASS: "{{ pwr_meter_amqp_pass }}"
          AMQP_VHOST: "/iot"
          PULSE_BINDING: "pwr-meter-pulse-19i"
          API_TOKEN: "{{ pwr_meter_api_token }}"
        restart_policy: unless-stopped

    - name: Setup proxy site pwr-meter-pulse-gw-19i.svc.n39.eu
      include_role:
        name: setup_http_site_proxy
      vars:
        site_name: "pwr-meter-pulse-gw-19i.svc.n39.eu"
        proxy_port: 9003


    - name: Setup docker container for BrotherQL Web UI printer
      docker_container:
        name: brotherql-web
        image: "{{ brotherql_web_image }}"
        pull: true
        restart_policy: unless-stopped
        state: started
        ports:
          - "127.0.0.1:{{ brotherql_host_port }}:8013"
        command: " ./brother_ql_web.py --model QL-720NW tcp://{{ brotherql_printer_ip }}"
        detach: yes
        env:
          TZ: "{{ timezone }}"

    - name: Setup proxy site labelprinter.n39.eu
      include_role:
        name: setup_http_site_proxy
      vars:
        site_name: labelprinter.n39.eu
        proxy_port: "{{ brotherql_host_port }}"


  handlers:
    - name: restart mosquitto
      docker_container:
        name: mosquitto
        state: started
        restart: yes