#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright: (c) 2017, Noah Sparks <nsparks@outlook.com>
# Copyright: (c) 2017, Henrik Wallström <henrik@wallstroms.nu>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)


ANSIBLE_METADATA = {'metadata_version': '1.1',
                    'status': ['preview'],
                    'supported_by': 'community'}


DOCUMENTATION = r'''
---
module: win_iis_webbinding
version_added: "2.0"
short_description: Configures a IIS Web site binding.
description:
     - Creates, Removes and configures a binding to an existing IIS Web site
options:
  name:
    description:
      - Names of web site
    required: true
    aliases: [website]
  state:
    description:
      - State of the binding
    choices:
      - present
      - absent
    default: present
  port:
    description:
      - The port to bind to / use for the new site.
    default: 80
  ip:
    description:
      - The IP address to bind to / use for the new site.
    default: '*'
  host_header:
    description:
      - The host header to bind to / use for the new site.
      - For state absent, you can use c('*') here to remove all bindings for a particular
        protocol/ip/port combination.
  protocol:
    description:
      - The protocol to be used for the Web binding (usually HTTP, HTTPS, or FTP).
    default: http
  certificate_hash:
    description:
      - Certificate hash (thumbprint) for the SSL binding. The certificate hash is the unique identifier for the certificate.
  certificate_store_name:
    description:
      - Name of the certificate store where the certificate for the binding is located.
    default: "my"
  ssl_flags:
    description:
      - This parameter is only valid on Server 2012 and newer.
      - Primarily used for enabling and disabling server name indication (SNI).
      - Set to c(0) to disable SNI.
      - Set to c(1) to enable SNI.
    version_added: "2.5"
author:
  - Noah Sparks (@nwsparks)
  - Henrik Wallström
'''

EXAMPLES = r'''
- name: Add a HTTP binding on port 9090
  win_iis_webbinding:
    name: Default Web Site
    port: 9090
    state: present

- name: Remove the HTTP binding on port 9090
  win_iis_webbinding:
    name: Default Web Site
    port: 9090
    state: absent

- name: Add a HTTPS binding
  win_iis_webbinding:
    name: Default Web Site
    protocol: https
    port: 443
    certificate_hash: B0D0FA8408FC67B230338FCA584D03792DA73F4C
    state: present

- name: Add a HTTPS binding with host header and SNI enabled
  win_iis_webbinding:
    name: Default Web Site
    protocol: https
    port: 443
    host_header: test.com
    ssl_flags: 1
    certificate_hash: D1A3AF8988FD32D1A3AF8988FD323792DA73F4C
    state: present

- name: Remove all https bindings on port 443
  win_iis_webbinding:
    name: Default Web Site
    protocol: https
    port: 443
    host_header: '*'
    state: absent
'''

RETURN = r'''
cert_is_wildcard:
  description:
    - Tells you if the certificate you are using is a wildcard
  returned: when certificate_hash is defined
  type: boolean
  sample: false
  version_added: "2.5"
certificate_subjects:
  description:
    - All of the subject names for the certificate you are using
  returned: when certificate_hash is defined
  type: list
  sample: ["*.test.com","test.com"]
  version_added: "2.5"
website_state:
  description:
    - The state of the website being targetted
    - Can be helpful in case you accidentally cause a binding collision
      which can result in the targetted site being stopped
  returned: always
  type: string
  sample: "Started"
  version_added: "2.5"
operation_type:
  description:
    - The type of operation performed
    - Can be removed, updated, matched, or added
  returned: on success
  type: string
  sample: "removed"
  version_added: "2.5"
binding_info:
  description:
    - Information on the binding being manipulated
  returned: on success
  type: dictionary
  sample: |-
    "binding_info": {
      "bindingInformation": "127.0.0.1:443:",
      "certificateHash": "FF3910CE089397F1B5A77EB7BAFDD8F44CDE77DD",
      "certificateStoreName": "MY",
      "hostheader": "",
      "ip": "127.0.0.1",
      "port": 443,
      "protocol": "https",
      "sslFlags": "not supported"
    }
  version_added: "2.5"
'''
