---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: Remove keycloak client to avoid failures from previous failed runs
  community.general.keycloak_client:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
    state: absent

- name: Create keycloak client with authorization services enabled
  community.general.keycloak_client:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
    state: present
    enabled: true
    public_client: false
    service_accounts_enabled: true
    authorization_services_enabled: true

- name: Create first custom policy (check_mode)
  community.general.keycloak_authz_custom_policy:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    name: FirstCustomPolicy
    state: present
    policy_type: script-policy-1.js
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
  check_mode: true
  register: result

- name: Assert that first custom policy was not created
  assert:
    that:
      - result is changed
      - result.end_state != {}
      - result.end_state.name == "FirstCustomPolicy"
      - result.end_state.type == "script-policy-1.js"
      - result.msg == 'Would create custom policy FirstCustomPolicy'

- name: Create first custom policy
  community.general.keycloak_authz_custom_policy:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    name: FirstCustomPolicy
    state: present
    policy_type: script-policy-1.js
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
  register: result

- name: Assert that first custom policy was created
  assert:
    that:
      - result is changed
      - result.end_state != {}
      - result.end_state.name == "FirstCustomPolicy"
      - result.end_state.type == "script-policy-1.js"
      - result.msg == 'Custom policy FirstCustomPolicy created'

- name: Attempt to update first custom policy (not possible)
  community.general.keycloak_authz_custom_policy:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    name: FirstCustomPolicy
    state: present
    policy_type: script-policy-2.js
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
  register: result

- name: Assert that first custom policy was not modified
  assert:
    that:
      - result is not changed
      - result.end_state != {}
      - result.end_state.name == "FirstCustomPolicy"
      - result.end_state.type == "script-policy-2.js"
      - result.msg == 'Custom policy FirstCustomPolicy already exists'

# Ensure that we can create multiple instances of the custom policy 
- name: Create second instance of the custom policy
  community.general.keycloak_authz_custom_policy:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    name: SecondCustomPolicy
    state: present
    policy_type: script-policy-1.js
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
  register: result

- name: Assert that second instance of the custom policy was created
  assert:
    that:
      - result is changed
      - result.end_state != {}
      - result.end_state.name == "SecondCustomPolicy"
      - result.end_state.type == "script-policy-1.js"
      - result.msg == 'Custom policy SecondCustomPolicy created'

- name: Remove second instance of the custom policy (check_mode)
  community.general.keycloak_authz_custom_policy:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    name: SecondCustomPolicy
    state: absent
    policy_type: script-policy-1.js
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
  check_mode: true
  register: result

- name: Assert that second custom policy was not removed
  assert:
    that:
      - result is changed
      - result.end_state == {}
      - result.msg == 'Would remove custom policy SecondCustomPolicy'

- name: Remove second instance of the custom policy
  community.general.keycloak_authz_custom_policy:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    name: SecondCustomPolicy
    state: absent
    policy_type: script-policy-1.js
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
  register: result

- name: Assert that second custom policy was removed
  assert:
    that:
      - result is changed
      - result.end_state == {}
      - result.msg == 'Custom policy SecondCustomPolicy removed'

- name: Remove keycloak client
  community.general.keycloak_client:
    auth_keycloak_url: "{{ url }}"
    auth_realm: "{{ admin_realm }}"
    auth_username: "{{ admin_user }}"
    auth_password: "{{ admin_password }}"
    realm: "{{ realm }}"
    client_id: "{{ client_id }}"
    state: absent
