---
- 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.2.1"

  roles:
    - role: docker_setup
      vars:
        docker_data_root: "/srv/docker"
    - 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
    - role: penguineer.dehydrated_cron


  tasks:
    - name: Ensure the mosquitto directories exist
      file:
        path: "{{ item }}"
        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"
      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

    - 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: Europe/Berlin
          NODE_RED_ENABLE_PROJECTS: "true"
        ports:
          - 127.0.0.1:9002:1880
        volumes:
          - "{{ nodered_data }}/data:/data"
        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:
          RABBITMQ_SECURE_PASSWORD: "yes"
        volumes:
          - "{{ rabbitmq_data }}/bitnami:/bitnami:rw"
          - "{{ rabbitmq_data }}/etc_rabbitmq:/etc/rabbitmq:rw"

    - 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:
          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 }}"

    - 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


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