#!/usr/bin/python
#
# Copyright 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

from __future__ import annotations

DOCUMENTATION = r"""
module: campfire
short_description: Send a message to Campfire
description:
  - Send a message to Campfire.
  - Messages with newlines result in a "Paste" message being sent.
extends_documentation_fragment:
  - community.general._attributes
attributes:
  check_mode:
    support: none
  diff_mode:
    support: none
options:
  subscription:
    type: str
    description:
      - The subscription name to use.
    required: true
  token:
    type: str
    description:
      - API token.
    required: true
  room:
    type: str
    description:
      - Room number to which the message should be sent.
    required: true
  msg:
    type: str
    description:
      - The message body.
    required: true
  notify:
    type: str
    description:
      - Send a notification sound before the message.
    choices:
      - 56k
      - bell
      - bezos
      - bueller
      - clowntown
      - cottoneyejoe
      - crickets
      - dadgummit
      - dangerzone
      - danielsan
      - deeper
      - drama
      - greatjob
      - greyjoy
      - guarantee
      - heygirl
      - horn
      - horror
      - inconceivable
      - live
      - loggins
      - makeitso
      - noooo
      - nyan
      - ohmy
      - ohyeah
      - pushit
      - rimshot
      - rollout
      - rumble
      - sax
      - secret
      - sexyback
      - story
      - tada
      - tmyk
      - trololo
      - trombone
      - unix
      - vuvuzela
      - what
      - whoomp
      - yeah
      - yodel

# informational: requirements for nodes
requirements: []
author: "Adam Garside (@fabulops)"
"""

EXAMPLES = r"""
- name: Send a message to Campfire
  community.general.campfire:
    subscription: foo
    token: 12345
    room: 123
    msg: Task completed.

- name: Send a message to Campfire
  community.general.campfire:
    subscription: foo
    token: 12345
    room: 123
    notify: loggins
    msg: Task completed ... with feeling.
"""

from html import escape as html_escape

from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.urls import fetch_url


def main():
    module = AnsibleModule(
        argument_spec=dict(
            subscription=dict(required=True),
            token=dict(required=True, no_log=True),
            room=dict(required=True),
            msg=dict(required=True),
            notify=dict(
                choices=[
                    "56k",
                    "bell",
                    "bezos",
                    "bueller",
                    "clowntown",
                    "cottoneyejoe",
                    "crickets",
                    "dadgummit",
                    "dangerzone",
                    "danielsan",
                    "deeper",
                    "drama",
                    "greatjob",
                    "greyjoy",
                    "guarantee",
                    "heygirl",
                    "horn",
                    "horror",
                    "inconceivable",
                    "live",
                    "loggins",
                    "makeitso",
                    "noooo",
                    "nyan",
                    "ohmy",
                    "ohyeah",
                    "pushit",
                    "rimshot",
                    "rollout",
                    "rumble",
                    "sax",
                    "secret",
                    "sexyback",
                    "story",
                    "tada",
                    "tmyk",
                    "trololo",
                    "trombone",
                    "unix",
                    "vuvuzela",
                    "what",
                    "whoomp",
                    "yeah",
                    "yodel",
                ]
            ),
        ),
        supports_check_mode=False,
    )

    subscription = module.params["subscription"]
    token = module.params["token"]
    room = module.params["room"]
    msg = module.params["msg"]
    notify = module.params["notify"]

    URI = f"https://{subscription}.campfirenow.com"
    AGENT = "Ansible/1.2"

    # Hack to add basic auth username and password the way fetch_url expects
    module.params["url_username"] = token
    module.params["url_password"] = "X"

    target_url = f"{URI}/room/{room}/speak.xml"
    headers = {"Content-Type": "application/xml", "User-agent": AGENT}

    # Send some audible notification if requested
    if notify:
        response, info = fetch_url(
            module,
            target_url,
            data=f"<message><type>SoundMessage</type><body>{html_escape(notify)}</body></message>",
            headers=headers,
        )
        if info["status"] not in [200, 201]:
            module.fail_json(
                msg=f"unable to send msg: '{notify}', campfire api returned error code: '{info['status']}'"
            )

    # Send the message
    response, info = fetch_url(
        module, target_url, data=f"<message><body>{html_escape(msg)}</body></message>", headers=headers
    )
    if info["status"] not in [200, 201]:
        module.fail_json(msg=f"unable to send msg: '{msg}', campfire api returned error code: '{info['status']}'")

    module.exit_json(changed=True, room=room, msg=msg, notify=notify)


if __name__ == "__main__":
    main()
