import os
import base64
from dotenv import find_dotenv, load_dotenv
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeResult, AnalyzeDocumentRequest
from azure.core.exceptions import HttpResponseError
from rest_framework.response import Response
from rest_framework import status


# def format_price(price_dict):
#     return "".join([f"{p}" for p in price_dict.values()])

class DocIntelAnalyzer:

    def analyze_receipts(self, file):


        #endpoint and key.
        endpoint = os.getenv('DOCUMENT_INTELLIGENCE_ENDPOINT')
        credential = AzureKeyCredential(os.getenv('DOCUMENT_INTELLIGENCE_API_KEY'))
        try:

            document_intelligence_client = DocumentIntelligenceClient(endpoint,  credential)
           
            poller = document_intelligence_client.begin_analyze_document(
                "prebuilt-receipt",
                analyze_request=AnalyzeDocumentRequest(bytes_source=file),
                locale="it-IT"
            ) 
            
            receipts: AnalyzeResult = poller.result()

            receipt_type_data = None
            merchant_data = None
            phone_data = None
            address_data= None
            transaction_date_data = None
            total_data = None

            # [START analyze_receipts]
            
            if receipts.documents:
                    for idx, receipt in enumerate(receipts.documents):
                        #print(f"--------Analysis of receipt #{idx + 1}--------")
                        #print(f"Receipt type: {receipt.doc_type if receipt.doc_type else 'N/A'}")
                        receipt_type_data = receipt.doc_type if receipt.doc_type else 'N/A'
                        if receipt.fields:
                            merchant_name = receipt.fields.get("MerchantName")
                            if merchant_name:
                                #print(
                                #    f"Merchant Name: {merchant_name.get('valueString')} has confidence: "
                                #    f"{merchant_name.confidence}"
                                #)
                                merchant_data = merchant_name.get('valueString')
                            merchant_phone_number = receipt.fields.get("MerchantPhoneNumber")
                            if merchant_phone_number:
                                #print(
                                #    f"Merchant Phone Number: {merchant_phone_number.get('valuePhoneNumber')} has confidence: "
                                #    f"{merchant_phone_number.confidence}"
                                #)
                                phone_data = merchant_phone_number.get('valuePhoneNumber')
                            merchant_address = receipt.fields.get('MerchantAddress')
                            if merchant_address:
                                #print(f"Merchant Address: {merchant_address.get('valueAddress')} has confidence: " 
                                #    f"{merchant_address.confidence}"
                                #)
                                address_data = merchant_address.get('valueAddress')
                            transaction_date = receipt.fields.get("TransactionDate")
                            if transaction_date:
                                #print(
                                #    f"Transaction Date: {transaction_date.get('valueDate')} has confidence: "
                                #    f"{transaction_date.confidence}"
                                #)
                                transaction_date_data = transaction_date.get('valueDate')
                            #transaction_time = receipt.fields.get("TransactionTime")
                            #if transaction_time:
                                #print(
                                #    f"Transaction Time: {transaction_time.get('valueTime')} has confidence: "
                                #   f"{transaction_time.confidence}"
                                #)
                                #transaction_time_data = transaction_time.get("valueTime")    
                            total = receipt.fields.get("Total")
                            if total:
                                value_currency = total.get('valueCurrency')
                                if value_currency:
                                    total_data = value_currency.amount
            
                        #print("--------------------------------------")

                        # [END analyze_receipts]
                        
                    #sometimes \n cause error in ai analyzer, so we must do splitlines) 
                    if merchant_data: 
                        merchant_data = " ".join(merchant_data.splitlines())

                    if total_data:
                        total_data = abs(total_data) 
                    return receipt_type_data, merchant_data, phone_data, address_data, transaction_date_data, total_data       


        except HttpResponseError as error:


            # if error.error is not None:
            #     if error.error.code == "InvalidImage":
            #         print(f"Received an invalid image error: {error.error}")

            #         handle_exception(GenericError(
            #             detail={"code": "invalid_image", "description": "The image provided is invalid."},
            #             status_code=400
            #         ))
            #         return Response(
            #     {'message': "Qualcosa è andato storto e il documento non può essere analizzato. Per favore, riprova a scattare la foto o a caricare nuovamente il documento."}, 
            #     status=status.HTTP_400_BAD_REQUEST)
            #     if error.error.code == "InvalidRequest":
            #         print(f"Uh-oh! Seems there was an invalid request: {error}")
            #         handle_exception(GenericError(

            #                 #print(f"Received an invalid request error: {error.error}")
            #         detail={"code": "invalid_request", "description": "Received an invalid request error."},
            #             status_code=400
            #         ))
            #         return Response(
            #     {'message': "Qualcosa è andato storto e il documento non può essere analizzato. Per favore, riprova a scattare la foto o a caricare nuovamente il documento."}, 
            #     status=status.HTTP_400_BAD_REQUEST)


            return Response(
                {'message': "Qualcosa è andato storto e il documento non può essere analizzato. Per favore, riprova a scattare la foto o a caricare nuovamente il documento."}, 
                status=status.HTTP_400_BAD_REQUEST)


        
