local json = require "cjson"
local request = require "luis.request"
local azure = require "luis.v3_0.azure"
local INTERNAL_SUBSCRIPTION_ID = "05e90651650a4550aaa817ced8449e3d" -- Este valor NO se encuentra en los valores que retorna los datos de los resources.

module(..., package.seeall)

local m_instanceOwner
function SetOwner (instanceOwner)
	m_instanceOwner = instanceOwner
end

local m_defaultAppVersion = "3.0-PREVIEW" 

local function MakeCompleteURI (uriBaseId, uri, ...)
	uriBaseId = uriBaseId or "WEBAPI"
	return m_instanceOwner:MakeCompleteURI(m_defaultAppVersion, uriBaseId, uri, ...) 
end

--[[
	Retorna los parametros:
		1) Si tiene paginado   : "?skip=0&take=2"
		2) Si no tiene paginado: ""
]]--
local function MakePagingParameters (params)
	local api = require "luis"
	return api.MakePagingParameters(params)
end


--[[
-----------------------------
Este método utiliza el WEBAPI, el mismo NO se encuentra dentro de la documentación del API.
En sí el mismo se obtuvo revisando con Fiddler los request que Microsoft Utiliza al momento de "Agregar Subscription Resources" desde su interfáz gráfica.
-----------------------------

	Request parameters
	------------
		appId string Format - guid. The application ID.

	Request headers
	------------
		Ocp-Apim-Subscription-Key string Subscription key which provides access to this API. Found in your Cognitive Services accounts.
		Request body

	Request body
	------------
		{
			"subscriptionId": "05e90651650a4550aaa817ced8449e3d",
			"region": "westus",
			"keyPath": "/subscriptions/dc506e4a-ff4a-4178-9e18-1750b4247451/resourceGroups/inconcert_luis_grp/providers/Microsoft.CognitiveServices/accounts/inconcert_luis"
		}

	Response 200
	------------
		{"code":"Success","message":"Operation Successful"}

	Request URL
	------------
		https://westus.api.cognitive.microsoft.com/luis/webapi/v2.0/apps/333eeeb3-4270-4b44-80a9-b8fdcd39124b/subscriptions


	------------------------------------
	NOTA:
		Los siguientes cuatros valores hay que identificar de donde provienen:
		En sí a estos siempre los está enviando al momento de Asignar unas "Resource a la APP" desde la GUI.
		(**) En la GUI pide:
			Tenant name (nombre del inquilino)
				eduardoiinconcertcc (defaul directory)
			Subscription Name
				Microsoft Azure Enterprise
			Luis resource name
				inconcert_luis (westus)

		Los valores en los POST quedan:
			{
				"subscriptionId": "05e90651650a4550aaa817ced8449e3d",
				"region": "westus",
				"keyPath": "/subscriptions/dc506e4a-ff4a-4178-9e18-1750b4247451/resourceGroups/inconcert_luis_grp/providers/Microsoft.CognitiveServices/accounts/inconcert_luis"
			}

		Y los valores que van dependiendo de (**) son:
			1- dc506e4a-ff4a-4178-9e18-1750b4247451 (AzureSubscriptionId)
			2- inconcert_luis_grp                   (ResourceGroup)
			3- inconcert_luis                       (AccountName)

		El valor 05e90651650a4550aaa817ced8449e3d (subscriptionId) NO se encuentra en los valores que retorna los datos de los resources.
		Por tal motivo lo agregamos hardcode.
]]--
function AssignAzureAccountsResourceToApp (appId, vcc)
	assert(type(appId) == "string")
	assert(type(vcc) == "string")

	LogInfo("[LUIS_WEBAPI:AssignAzureAccountsResourceToApp] WEBAPI -> Assigning Azure Account to app: '%s', vcc: '%s'.", appId, vcc)

	-- Obtengo la info las Account de Azure que se han almacenado para el VCC
	local vccAzureAccounts, total = azure.LoadVCCAccounts(vcc)
	if total == 0 then
		local err = {reason = "VCC has not assigned Azure Accounts", vcc = vcc}
		LogError("[LUIS_WEBAPI:AssignAzureAccountsResourceToApp] WEBAPI -> VCC %s has not assigned Azure Accounts.", vcc)
		return false, err
	end
	local vccAzureSubscriptionId = next(vccAzureAccounts)
	local vccAzureAccount = vccAzureAccounts[vccAzureSubscriptionId]
	--LogDebug("1 WEBAPI -> vccAzureAccount %s -> %s", vcc, json.encode(vccAzureAccount))

	local data = {
		subscriptionId = INTERNAL_SUBSCRIPTION_ID, -- Este valor NO se encuentra en los valores que retorna los datos de los resources.
		region = vccAzureAccount.Location or "westus",
		keyPath = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.CognitiveServices/accounts/%s"
	}

	data.keyPath = data.keyPath:format(
		vccAzureAccount.AzureSubscriptionId, -- "dc506e4a-ff4a-4178-9e18-1750b4247451"
		vccAzureAccount.ResourceGroup, -- "inconcert_luis_grp"
		vccAzureAccount.AccountName -- "inconcert_luis"
	)

	local uri = MakeCompleteURI("WEBAPI_APPS", "%s/subscriptions", appId)
	local success, response = request.Post(uri, data)
	if not success then
		LogError("[LUIS_WEBAPI:AssignAzureAccountsResourceToApp] WEBAPI -> Error Assigning  Azure Account Resource to App '%s'. Error: '%s'", appId, json.encode(response))
		return false, response
	end

	response = table.concat(response)
	LogInfo("[LUIS_WEBAPI:AssignAzureAccountsResourceToApp] WEBAPI -> Success Assigned Azure Account Resource to appId '%s'. Response", appId)

	--LogDebug("[LUIS_WEBAPI:AssignAzureAccountsResourceToApp] WEBAPI -> Assigned Azure Account Resource Response: '%s'", json.encode(response))
	return true, response
end


--[[
-----------------------------
Este método utiliza el WEBAPI, el mismo NO se encuentra dentro de la documentación del API.
En sí el mismo se obtuvo revisando con Fiddler los request que Microsoft Utiliza al momento de "Quitar Subscription Resources" desde su interfáz gráfica.
-----------------------------



	Request parameters
	------------
		appId string Format - guid. The application ID.
		subscriptionId string Format - guid. 05e90651650a4550aaa817ced8449e3d (Hardcode ya que es un valor que se encuentra dentro de los resources.)

	Request headers
	------------
		Ocp-Apim-Subscription-Key string Subscription key which provides access to this API. Found in your Cognitive Services accounts.
		Request body

	Request body
	------------
		...

	Response 200
	------------
		{"code":"Success","message":"Operation Successful"}

	Request URL
	------------
		https://westus.api.cognitive.microsoft.com/luis/webapi/v2.0/apps/75009bfa-6627-4c01-b0db-51344799a15c/subscriptions/05e90651650a4550aaa817ced8449e3d


	------------------------------------
	NOTA:
		El valor 05e90651650a4550aaa817ced8449e3d (subscriptionId) NO se encuentra en los valores que retorna los datos de los resources.
		Por tal motivo lo agregamos hardcode.
]]--
function UnassignAzureAccountsResourceOfApp (appId, vcc)
	assert(type(appId) == "string")
	assert(type(vcc) == "string")

	LogInfo("[LUIS_WEBAPI:UnassignAzureAccountsResourceOfApp] WEBAPI -> Unassigning Azure Account of app: '%s', vcc: '%s'.", appId, vcc)

	-- Obtengo la info las Account de Azure que se han almacenado para el VCC
	local vccAzureAccounts, total = azure.LoadVCCAccounts(vcc)
	if total == 0 then
		local err = {reason = "VCC has not assigned Azure Accounts", vcc = vcc}
		LogError("[LUIS_WEBAPI:UnassignAzureAccountsResourceOfApp] WEBAPI -> VCC %s has not assigned Azure Accounts.", vcc)
		return false, err
	end

	local uri = MakeCompleteURI("WEBAPI_APPS", "%s/subscriptions/%s", appId, INTERNAL_SUBSCRIPTION_ID)
	local success, response = request.Delete(uri)
	if not success then
		LogError("[LUIS_WEBAPI:UnassignAzureAccountsResourceOfApp] WEBAPI -> Error Unassigning Azure Account Resource of App '%s'. Error: '%s'", appId, json.encode(response))
		return false, response
	end

	response = table.concat(response)
	LogInfo("[LUIS_WEBAPI:UnassignAzureAccountsResourceOfApp] WEBAPI -> Success Unassigned Azure Account Resource of appId '%s'. Response", appId)
	--LogDebug("[LUIS_WEBAPI:UnassignAzureAccountsResourceOfApp] WEBAPI -> Unassigned Azure Account Resource Response: '%s'", response)

	return true, response
end
