#########################################################################################
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.                    #
# SPDX-License-Identifier: MIT-0                                                        #
#                                                                                       #
# Permission is hereby granted, free of charge, to any person obtaining a copy of this  #
# software and associated documentation files (the "Software"), to deal in the Software #
# without restriction, including without limitation the rights to use, copy, modify,    #
# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to    #
# permit persons to whom the Software is furnished to do so.                            #
#                                                                                       #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,   #
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A         #
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT    #
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION     #
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE        #
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                                #
#########################################################################################


import unittest
import boto3
import logging
import os
from unittest import TestCase, mock
from moto import mock_dynamodb

# This is to get around the relative path import issue.
# Absolute paths are being used in this file after setting the root directory
import sys
from pathlib import Path

file = Path(__file__).resolve()
package_root_directory = file.parents[1]
sys.path.append(str(package_root_directory))
sys.path.append(str(package_root_directory) + '/lambda_layers/lambda_layer_policy/python/')
sys.path.append(str(package_root_directory) + '/lambda_layers/lambda_layer_auth/python/')

# Set log level
loglevel = logging.INFO
logging.basicConfig(level=loglevel)
log = logging.getLogger(__name__)

default_http_headers = {
    'Access-Control-Allow-Origin': '*',
    'Strict-Transport-Security': 'max-age=63072000; includeSubDomains; preload',
    'Content-Security-Policy': "base-uri 'self'; upgrade-insecure-requests; default-src 'none'; object-src 'none'; connect-src none; img-src 'self' data:; script-src blob: 'self'; style-src 'self'; font-src 'self' data:; form-action 'self';"
}


@mock.patch('lambda_item.MFAuth')
def mock_getAdminResourcePolicy():
    return {'action': 'allow'}


# Setting the default AWS region environment variable required by the Python SDK boto3
@mock.patch.dict(os.environ, {'AWS_DEFAULT_REGION': 'us-east-1', 'region': 'us-east-1', 'application': 'cmf',
                              'environment': 'unittest', 'userpool': 'testuserpool', 'clientid': 'testclientid'})
class LambdaAuthTest(TestCase):
    def test_lambda_handler_with_method(self):
        from lambda_functions.lambda_auth import lambda_auth
        log.info("Testing lambda_auth GET with method passed")
        self.event = {'methodArn': 'test:test:test:test:test:test/apiarntest1/arn2/arn3',
                      'headers': {'Authorization': 'test'}}
        result = lambda_auth.lambda_handler(self.event, None)
        data = result
        # print("Result data: ", data)
        expected_response = {
            'policyDocument':
                {
                    'Statement': [
                        {
                            'Action': 'execute-api:Invoke',
                            'Effect': 'Deny',
                            'Resource': ['arn:aws:execute-api:test:test:test/apiarntest1/*/*']
                        }
                    ],
                    'Version': '2012-10-17'},
            'principalId': ''}
        self.assertEqual(data, expected_response)

    def test_lambda_handler_without_method(self):
        from lambda_functions.lambda_auth import lambda_auth
        log.info("Testing lambda_auth without method passed")
        self.event = {'methodArn': 'test:test:test:test:test:test/apiarntest1/arn2/arn3',
                      'headers': {'Authorization': 'test'}}
        result = lambda_auth.lambda_handler(self.event, None)
        data = result
        # print("Result data: ", data)
        expected_response = {
                             'policyDocument':
                                 {
                                     'Statement': [
                                         {
                                             'Action': 'execute-api:Invoke',
                                             'Effect': 'Deny',
                                             'Resource': ['arn:aws:execute-api:test:test:test/apiarntest1/*/*']
                                         }
                                     ],
                                     'Version': '2012-10-17'},
                             'principalId': ''}
        self.assertEqual(data, expected_response)