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

# Copyright (c) 2021, Cisco Systems
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)

DOCUMENTATION = r"""
---
module: nfv_profile
short_description: Resource module for Nfv Profile
description:
- Manage operations create, update and delete of the resource Nfv Profile.
- API to create network profile for different NFV topologies.
- API to delete nfv network profile.
- API to update a NFV Network profile.
version_added: '3.1.0'
extends_documentation_fragment:
  - cisco.dnac.module
author: Rafael Campos (@racampos)
options:
  device:
    description: Nfv Profile's device.
    elements: dict
    suboptions:
      customNetworks:
        description: Nfv Profile's customNetworks.
        elements: dict
        suboptions:
          connectionType:
            description: Type of network connection from custom network (eg lan).
            type: str
          networkName:
            description: Name of custom network (eg cust-1).
            type: str
          servicesToConnect:
            description: Nfv Profile's servicesToConnect.
            elements: dict
            suboptions:
              serviceName:
                description: Name of service to be connected to the custom network (eg
                  router-1).
                type: str
            type: list
          vlanId:
            description: Vlan id for the custom network(eg 4000).
            type: int
          vlanMode:
            description: Network mode (eg Access or Trunk).
            type: str
        type: list
      customTemplate:
        description: Nfv Profile's customTemplate.
        elements: dict
        suboptions:
          deviceType:
            description: Type of the device(eg Cisco 5400 Enterprise Network Compute
              System).
            type: str
          template:
            description: Name of the template(eg NFVIS template).
            type: str
          templateType:
            description: Name of the template type to which template is associated (eg
              Cloud DayN Templates).
            type: str
        type: list
      deviceTag:
        description: Device Tag name(eg dev1).
        type: str
      deviceType:
        description: Name of the device used in creating nfv profile.
        type: str
      directInternetAccessForFirewall:
        description: Direct internet access value should be boolean (eg false or true).
        type: bool
      serviceProviderProfile:
        description: Nfv Profile's serviceProviderProfile.
        elements: dict
        suboptions:
          connect:
            description: Connection of service provider and device value should be boolean
              (eg true).
            type: bool
          connectDefaultGatewayOnWan:
            description: Connect default gateway connect value as boolean (eg true).
            type: bool
          linkType:
            description: Name of connection type(eg GigabitEthernet).
            type: str
          serviceProvider:
            description: Name of the service provider(eg Airtel).
            type: str
        type: list
      services:
        description: Nfv Profile's services.
        elements: dict
        suboptions:
          firewallMode:
            description: Firewall mode details example (routed, transparent).
            type: str
          imageName:
            description: Service image name (eg isrv-universalk9.16.12.01a.tar.gz).
            type: str
          profileType:
            description: Profile type of service (eg ISRv-mini).
            type: str
          serviceName:
            description: Name of the service (eg Router-1).
            type: str
          serviceType:
            description: Service type (eg ISRV).
            type: str
          vNicMapping:
            description: Nfv Profile's vNicMapping.
            elements: dict
            suboptions:
              assignIpAddressToNetwork:
                description: Assign ip address to network (eg true or false).
                type: str
              networkType:
                description: Type of connection (eg wan, lan or internal).
                type: str
            type: list
        type: list
      vlanForL2:
        description: Nfv Profile's vlanForL2.
        elements: dict
        suboptions:
          vlanDescription:
            description: Vlan description(eg Access 4018).
            type: str
          vlanId:
            description: Vlan id (eg 4018).
            type: int
          vlanType:
            description: Vlan type(eg Access or Trunk).
            type: str
        type: list
    type: list
  id:
    description: Id path parameter. Id of the NFV profile to be updated.
    type: str
  name:
    description: Name query parameter. Name of the profile to be updated.
    type: str
  profileName:
    description: Name of the profile to create NFV profile.
    type: str
requirements:
- dnacentersdk >= 2.7.1
- python >= 3.9
seealso:
- name: Cisco DNA Center documentation for Site Design CreateNFVProfile
  description: Complete reference of the CreateNFVProfile API.
  link: https://developer.cisco.com/docs/dna-center/#!create-nfv-profile
- name: Cisco DNA Center documentation for Site Design DeleteNFVProfile
  description: Complete reference of the DeleteNFVProfile API.
  link: https://developer.cisco.com/docs/dna-center/#!delete-nfv-profile
- name: Cisco DNA Center documentation for Site Design UpdateNFVProfile
  description: Complete reference of the UpdateNFVProfile API.
  link: https://developer.cisco.com/docs/dna-center/#!update-nfv-profile
notes:
  - SDK Method used are
    site_design.SiteDesign.create_nfv_profile,
    site_design.SiteDesign.delete_nfv_profile,
    site_design.SiteDesign.update_nfv_profile,

  - Paths used are
    post /dna/intent/api/v1/nfv/network-profile,
    delete /dna/intent/api/v1/nfv/network-profile/{id},
    put /dna/intent/api/v1/nfv/network-profile/{id},

"""

EXAMPLES = r"""
- name: Create
  cisco.dnac.nfv_profile:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: present
    device:
    - customNetworks:
      - connectionType: string
        networkName: string
        servicesToConnect:
        - serviceName: string
        vlanId: 0
        vlanMode: string
      customTemplate:
      - deviceType: string
        template: string
        templateType: string
      deviceTag: string
      deviceType: string
      directInternetAccessForFirewall: true
      serviceProviderProfile:
      - connect: true
        connectDefaultGatewayOnWan: true
        linkType: string
        serviceProvider: string
      services:
      - firewallMode: string
        imageName: string
        profileType: string
        serviceName: string
        serviceType: string
        vNicMapping:
        - assignIpAddressToNetwork: string
          networkType: string
      vlanForL2:
      - vlanDescription: string
        vlanId: 0
        vlanType: string
    profileName: string

- name: Update by id
  cisco.dnac.nfv_profile:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: present
    device:
    - currentDeviceTag: string
      customNetworks:
      - connectionType: string
        networkName: string
        servicesToConnect:
        - serviceName: string
        vlanId: 0
        vlanMode: string
      customTemplate:
      - deviceType: string
        template: string
        templateType: string
      deviceTag: string
      directInternetAccessForFirewall: true
      services:
      - firewallMode: string
        imageName: string
        profileType: string
        serviceName: string
        serviceType: string
        vNicMapping:
        - assignIpAddressToNetwork: string
          networkType: string
      vlanForL2:
      - vlanDescription: string
        vlanId: 0
        vlanType: string
    id: string
    name: string

- name: Delete by id
  cisco.dnac.nfv_profile:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: absent
    id: string
    name: string

"""

RETURN = r"""
dnac_response:
  description: A dictionary or list with the response returned by the Cisco DNAC Python SDK
  returned: always
  type: dict
  sample: >
    {
      "executionId": "string",
      "executionStatusUrl": "string",
      "message": "string"
    }
"""
