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

# Copyright: (c) 2015, Joseph Callen <jcallen () csc.com>
# Copyright: (c) 2018, 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 absolute_import, division, print_function
__metaclass__ = type


DOCUMENTATION = r'''
---
module: vmware_datacenter
short_description: Manage VMware vSphere Datacenters
description:
    - This module can be used to manage (create, delete) VMware vSphere Datacenters.
author:
- Joseph Callen (@jcpowermac)
- Kamil Szczygiel (@kamsz)
options:
    datacenter_name:
      description:
      - The name of the datacenter the cluster will be created in.
      required: true
      type: str
    state:
      description:
      - If the datacenter should be present or absent.
      choices: [ present, absent ]
      default: present
      type: str
extends_documentation_fragment:
- community.vmware.vmware.documentation

'''

EXAMPLES = r'''
- name: Create Datacenter
  community.vmware.vmware_datacenter:
    hostname: '{{ vcenter_hostname }}'
    username: '{{ vcenter_username }}'
    password: '{{ vcenter_password }}'
    datacenter_name: '{{ datacenter_name }}'
    state: present
  delegate_to: localhost

- name: Delete Datacenter
  community.vmware.vmware_datacenter:
    hostname: '{{ vcenter_hostname }}'
    username: '{{ vcenter_username }}'
    password: '{{ vcenter_password }}'
    datacenter_name: '{{ datacenter_name }}'
    state: absent
  delegate_to: localhost
  register: datacenter_delete_result
'''

RETURN = r'''#
'''

try:
    from pyVmomi import vim, vmodl
except ImportError:
    pass

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.community.vmware.plugins.module_utils.vmware import PyVmomi, find_datacenter_by_name, wait_for_task
from ansible_collections.community.vmware.plugins.module_utils._argument_spec import base_argument_spec
from ansible.module_utils._text import to_native


class VmwareDatacenterManager(PyVmomi):
    def __init__(self, module):
        super(VmwareDatacenterManager, self).__init__(module)
        self.datacenter_name = self.params.get('datacenter_name')
        self.datacenter_obj = self.get_datacenter()

    def ensure(self):
        state = self.module.params.get('state')

        if state == 'present':
            self.create_datacenter()

        if state == 'absent':
            self.destroy_datacenter()

    def get_datacenter(self):
        try:
            datacenter_obj = find_datacenter_by_name(self.content, self.datacenter_name)
            return datacenter_obj
        except (vmodl.MethodFault, vmodl.RuntimeFault) as runtime_fault:
            self.module.fail_json(msg="Failed to get datacenter '%s'"
                                      " due to : %s" % (self.datacenter_name,
                                                        to_native(runtime_fault.msg)))
        except Exception as generic_exc:
            self.module.fail_json(msg="Failed to get datacenter"
                                      " '%s' due to generic error: %s" % (self.datacenter_name,
                                                                          to_native(generic_exc)))

    def create_datacenter(self):
        folder = self.content.rootFolder
        changed = False
        try:
            if not self.datacenter_obj and not self.module.check_mode:
                changed = True
                folder.CreateDatacenter(name=self.datacenter_name)
            self.module.exit_json(changed=changed)
        except vim.fault.DuplicateName:
            self.module.exit_json(changed=changed)
        except vim.fault.InvalidName as invalid_name:
            self.module.fail_json(msg="Specified datacenter name '%s' is an"
                                      " invalid name : %s" % (self.datacenter_name,
                                                              to_native(invalid_name.msg)))
        except vmodl.fault.NotSupported as not_supported:
            # This should never happen
            self.module.fail_json(msg="Trying to create a datacenter '%s' on"
                                      " an incorrect folder object : %s" % (self.datacenter_name,
                                                                            to_native(not_supported.msg)))
        except (vmodl.RuntimeFault, vmodl.MethodFault) as runtime_fault:
            self.module.fail_json(msg="Failed to create a datacenter"
                                      " '%s' due to : %s" % (self.datacenter_name,
                                                             to_native(runtime_fault.msg)))
        except Exception as generic_exc:
            self.module.fail_json(msg="Failed to create a datacenter"
                                      " '%s' due to generic error: %s" % (self.datacenter_name,
                                                                          to_native(generic_exc)))

    def destroy_datacenter(self):
        results = dict(changed=False)
        try:
            if self.datacenter_obj and not self.module.check_mode:
                task = self.datacenter_obj.Destroy_Task()
                changed, result = wait_for_task(task)
                results['changed'] = changed
                results['result'] = result
            self.module.exit_json(**results)
        except (vim.fault.VimFault, vmodl.RuntimeFault, vmodl.MethodFault) as runtime_fault:
            self.module.fail_json(msg="Failed to delete a datacenter"
                                      " '%s' due to : %s" % (self.datacenter_name,
                                                             to_native(runtime_fault.msg)))
        except Exception as generic_exc:
            self.module.fail_json(msg="Failed to delete a datacenter"
                                      " '%s' due to generic error: %s" % (self.datacenter_name,
                                                                          to_native(generic_exc)))


def main():
    argument_spec = base_argument_spec()
    argument_spec.update(
        dict(
            datacenter_name=dict(required=True, type='str'),
            state=dict(default='present', choices=['present', 'absent'], type='str')
        )
    )
    module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)

    vmware_datacenter_mgr = VmwareDatacenterManager(module)
    vmware_datacenter_mgr.ensure()


if __name__ == '__main__':
    main()
