---
- name: System Setup and Configuration
  hosts: all
  become: true

  tasks:
    - name: Set locale to C.UTF-8
      command: localectl set-locale LANG=C.UTF-8

    - name: Create APT configuration file to assume yes
      ansible.builtin.copy:
        dest: /etc/apt/apt.conf.d/90forceyes
        content: |
          APT::Get::Assume-Yes "true";
        mode: '0644'

    - name: Append command to .bash_history
      ansible.builtin.blockinfile:
        path: "~/.bash_history"
        create: true
        block: |
          docker logs infernet-node -f
        marker: ""
        mode: '0644'

    - name: Update /etc/bash.bashrc
      ansible.builtin.blockinfile:
        path: /etc/bash.bashrc
        block: |
          export HISTTIMEFORMAT='%F, %T '
          export HISTSIZE=10000
          export HISTFILESIZE=10000
          shopt -s histappend
          export PROMPT_COMMAND='history -a'
          export HISTCONTROL=ignoredups
          export LANG=C.UTF-8
          export LC_ALL=C.UTF-8
          alias ls='ls --color=auto'
          shopt -s cmdhist
        create: true
        marker: ""
        mode: '0644'

    - name: Update .inputrc for the current user
      ansible.builtin.blockinfile:
        path: "{{ ansible_env.HOME }}/.inputrc"
        block: |
          "\e[A": history-search-backward
          "\e[B": history-search-forward
        create: true
        marker: ""
        mode: '0644'

    - name: Update ~/.nanorc
      ansible.builtin.blockinfile:
        path: "{{ ansible_env.HOME }}/.nanorc"
        block: |
          set nohelp
          set tabsize 4
          set tabstospaces
          set autoindent
          set positionlog
          set backup
          set backupdir /tmp/
          set locking
          include /usr/share/nano/*.nanorc
        create: true
        marker: ""
        mode: '0644'

    - name: Set hostname
      ansible.builtin.hostname:
        name: "{{ serverid }}"

    - name: Ensure hostname is in /etc/hosts
      ansible.builtin.lineinfile:
        path: /etc/hosts
        regexp: '^127\.0\.1\.1\s+'
        line: "127.0.1.1 {{ serverid }}"
        state: present

    - name: Update and upgrade apt
      ansible.builtin.apt:
        update_cache: true
        upgrade: dist
        force_apt_get: true
      register: apt_update_result
      until: apt_update_result is success

    - name: Install necessary packages
      ansible.builtin.apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - make
          - iftop
          - python3
        state: present

    - name: Install pip package web3
      ansible.builtin.pip:
        name: web3
        extra_args: --break-system-packages

    - name: Install Docker
      ansible.builtin.shell: curl -sL https://get.docker.com | sudo sh -

    - name: Update Docker daemon configuration for journald logging
      ansible.builtin.copy:
        dest: /etc/docker/daemon.json
        content: |
          { "log-driver": "journald" }

    - name: Restart Docker
      ansible.builtin.service:
        name: docker
        state: restarted

    - name: Docker login
      ansible.builtin.shell: docker login -u {{ docker_username }} -p {{ docker_password }}

    - name: Update journald log SystemMaxUse=2G configuration
      ansible.builtin.lineinfile:
        path: /etc/systemd/journald.conf
        regexp: '^SystemMaxUse='
        line: 'SystemMaxUse=2G'
        state: present
        backup: yes
        validate: 'journaldctl check-config %s'

    - name: Restart journald
      ansible.builtin.service:
        name: systemd-journald
        state: restarted

    - name: Setup Foundry
      ansible.builtin.shell: |
        mkdir -p ~/foundry && cd ~/foundry
        curl -L https://foundry.paradigm.xyz | bash
      args:
        executable: /bin/bash

    - name: Run foundryup
      ansible.builtin.shell: |
        source ~/.bashrc && foundryup
      args:
        executable: /bin/bash

    - name: Clone repository
      ansible.builtin.git:
        repo: https://gitea.vvzvlad.xyz/vvzvlad/ritual.git
        dest: "{{ ansible_env.HOME }}/ritual"
        version: "{{ git_version }}"
        force: true
      async: "{{ 60 * 15 }}"
      poll: 30

    - name: Update wallet, private key and RPC URL in project
      ansible.builtin.shell: bash update.sh {{ wallet }} {{ private_key }} {{ rpc_url }}
      args:
        chdir: "{{ ansible_env.HOME }}/ritual"

    - name: Remove old Forge and Infernet SDK
      ansible.builtin.shell: |
        rm -rf {{ ansible_env.HOME }}/ritual/projects/hello-world/contracts/lib/forge-std
        rm -rf {{ ansible_env.HOME }}/ritual/projects/hello-world/contracts/lib/infernet-sdk

    - name: Install Forge and Infernet SDK
      ansible.builtin.shell: |
        cd {{ ansible_env.HOME }}/foundry && source {{ ansible_env.HOME }}/.bashrc && foundryup
        cd {{ ansible_env.HOME }}/ritual/projects/hello-world/contracts
        forge install --no-commit foundry-rs/forge-std
        forge install --no-commit ritual-net/infernet-sdk
      args:
        executable: /bin/bash

    - name: Deploy container
      ansible.builtin.shell: project=hello-world make deploy-container
      args:
        chdir: "{{ ansible_env.HOME }}/ritual"

    - name: Deploy contracts
      ansible.builtin.shell: project=hello-world make deploy-contracts 2>&1
      register: contract_deploy_output
      args:
        chdir: "{{ ansible_env.HOME }}/ritual"
      retries: 2
      delay: 60
      failed_when: '"ONCHAIN EXECUTION COMPLETE & SUCCESSFUL" not in contract_deploy_output.stdout'

    - name: Update CallContract.s.sol with contract address
      ansible.builtin.shell: |
        contract_address=$(jq -r '.transactions[0].contractAddress' projects/hello-world/contracts/broadcast/Deploy.s.sol/8453/run-latest.json)
        checksum_address=$(python3 toChecksumAddress.py $contract_address)
        sed -i "s/SaysGM(.*/SaysGM($checksum_address);/" projects/hello-world/contracts/script/CallContract.s.sol
      args:
        chdir: "{{ ansible_env.HOME }}/ritual"

    - name: Call contract
      ansible.builtin.shell: project=hello-world make call-contract 2>&1
      register: contract_call_output
      args:
        chdir: "{{ ansible_env.HOME }}/ritual"
      retries: 2
      delay: 60
      failed_when: '"ONCHAIN EXECUTION COMPLETE & SUCCESSFUL" not in contract_call_output.stdout'

    - name: Set Docker containers to restart unless stopped
      ansible.builtin.shell: |
        docker update --restart unless-stopped hello-world
        docker update --restart unless-stopped infernet-node
        docker update --restart unless-stopped deploy-redis-1
        docker update --restart unless-stopped infernet-anvil
        docker update --restart unless-stopped deploy-fluentbit-1

    - name: Remove docker login credentials
      ansible.builtin.shell: rm -rf /root/.docker/config.json
