# coding: utf8
from __future__ import unicode_literals
from http.client import HTTPResponse
import logging
 
from backoffice.models import *
from eth_account.messages import defunct_hash_message
from web3 import Web3
import requests
from tixsell import settings
import json

def run():

     

        payload='{"webhookId":"wh_mhw8p7benruzeija","id":"whevt_o3q5onqlfdckqw1b","createdAt":"2023-12-14T10:24:02.173Z","type":"NFT_ACTIVITY","event":{"network":"MATIC_MUMBAI","activity":[{"fromAddress":"0x391b856b754b633f9a63a48908d7d4d8eb0e582d","toAddress":"0xb3f37e15d98e948daf68819a21c6802ef34f1c23","contractAddress":"0x97b02f3267754f7a2927c755aa576c334f3c0a51","blockNum":"0x298a760","hash":"0x95e4d332efbf78e3bed566deba4ae7cc8de29e2fcedca862614293218361ee57","erc721TokenId":"0x8","category":"erc721","log":{"address":"0x97b02f3267754f7a2927c755aa576c334f3c0a51","topics":["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000391b856b754b633f9a63a48908d7d4d8eb0e582d","0x000000000000000000000000b3f37e15d98e948daf68819a21c6802ef34f1c23","0x0000000000000000000000000000000000000000000000000000000000000008"],"data":"0x","blockNumber":"0x298a760","transactionHash":"0x95e4d332efbf78e3bed566deba4ae7cc8de29e2fcedca862614293218361ee57","transactionIndex":"0x24","blockHash":"0xec6764c0ae1e9c48e5bdb842045d832a6091f8ac3921eb1eed5c3d74e1d0c611","logIndex":"0x6f","removed":false}}]}}'
        data = json.loads(payload)
        type = data["type"]
        if type=="NFT_ACTIVITY":
            event = data["event"]
            if "activity" in event:
                activity = event["activity"][0]
                if activity["category"]=="erc721":
                    fromAddress = activity["fromAddress"]
                   
                    toAddress = activity["toAddress"]
                    erc721TokenId = int(activity["erc721TokenId"],0)
                    contractAddress = activity["contractAddress"]
                    txHash = activity["hash"]
                    print("[WebHook] Doit trouver toekn "+str(erc721TokenId)+" pour contrat "+contractAddress+" newOwner "+toAddress)
                    # adapt ticket avec -1 doit Être assigné...
                    tokens = Ticket.objects.filter(refTicketType__refEvent__ticketContract__iexact=contractAddress)
                    if tokens.exists():
                        #si 1st mint on ignore
                        if fromAddress=="0x0000000000000000000000000000000000000000":
                             print("==== Nouveau mint de NFT on stop")
                             return HTTPResponse(status=200)
                        for ticket in tokens:
                            #check tokenId 
                            if ticket.ticketId==-1 and ticket.lastOwner==settings.SELLTIX_WALLET and ticket.hashedTicket=="TO_BE_SET":
                                ticket.ticketId=str(erc721TokenId) 
                                ticket.transactionHash = txHash
                                ticket.save()
                            else:
                                if ticket.ticketId==erc721TokenId:
                                    doAssignement=True
                                    if ticket.refUser:
                                        if ticket.refUser.walletAddress.lower()==toAddress.lower():
                                            print("[WebHook] Same owner do nothing")
                                            doAssignement=False
                                        else:
                                            print("[WebHook] Different owner")
                                    
                                    if doAssignement:
                                        #find a user with this wallet ?
                                        userToAssign=None 
                                        try:
                                            user = User.objects.get(walletAddress__iexact=toAddress)
                                            print("[WebHook]user trouve on change association %s"%user)
                                            userToAssign = user
                                        except Exception as e:
                                            print("[WebHook] ===Pas de user")
                                            
                                        # Create an history
                                        ticketHistory = TicketHistory()
                                        ticketHistory.refUser = ticket.refUser
                                        ticketHistory.wallet = ticket.lastOwner
                                        ticketHistory.pricePaid = ticket.pricePaid
                                        ticketHistory.save()
                                        # Update ticket
                                        ticket.refUser=userToAssign
                                        ticket.lastOwner = toAddress
                                        #NOTE: on ne connait pas le nouveau prix payé quand ça provient de la blockchain !!!
                                        try:
                                            api_key = settings.ALCHEMY_ACCESS_KEY
                                            url = ""
                                            if settings.DEBUG:
                                                url = "https://matic-mumbai.g.alchemy.com/v2/"+api_key
                                            else:
                                                url = "https://matic-mainnet.g.alchemy.com/v2/"+api_key
                                            
                                            payload = {
                                                "id": 1,
                                                "jsonrpc": "2.0",
                                                "params": [txHash],
                                                "method": "eth_getTransactionByHash"
                                            }
                                            headers = {
                                                "accept": "application/json",
                                                "content-type": "application/json"
                                            }

                                            response = requests.post(url, json=payload, headers=headers)
                                            if response.status_code==200:
                                                data = json.loads(response.text)
                                                if data["result"]:                                        
                                                    valueHex = data["result"]["value"]
                                                    value = float.fromhex(valueHex)
                                                    finalPrice = Web3.from_wei( value,'ether')
                                                    ticket.pricePaid = finalPrice
                                        except Exception as e:
                                            print(e)
                                        #add history
                                        ticket.owners.add(ticketHistory)
                                        ticket.save()
                                else:
                                    print("Pas egal")
                    else:
                        #:sauver info et prévenir SellTix
                        from backoffice.helpers import sendEmail
                        message="Billet minté sur blockchain pas encore trouvé dans backend contrat<b>%s</b> Token %d"%(contractAddress,erc721TokenId)
                        sendEmail("csurbier@idevotion.fr","[SellTix] Pour info Ticket miné pas encore dans backend",message)