from flask import Blueprint, request
import requests
import logging
from datetime import datetime, timedelta
from firebase.firebase import Firebase
import pytz 
import utility.function as func
import os
logging.basicConfig(level=logging.INFO)

adRoute = Blueprint('facebook_ad', __name__, url_prefix='/facebook-ad')

fb = Firebase(host=os.environ.get("FIREBASE_HOST"))
timezone = pytz.timezone('Asia/Bangkok')

@adRoute.route('/event',  methods=['POST'])
@adRoute.route('/event/',  methods=['POST'])
def facebook_ad_view():
    from bigquery.bq import BigQuery
    bq = BigQuery()
    #date setup
    dateStr = datetime.now(timezone).date().strftime("%Y%m%d")
    hourStr = (datetime.now(timezone) - timedelta(hours=1)).strftime("%H")
    eventTemp = fb.db.reference().child(f"event/{dateStr}/{hourStr}").get()
    for ch in eventTemp:
        for acc in eventTemp[ch]:
            for page in eventTemp[ch][acc]:
                pagetemp = eventTemp[ch][acc][page]
                pageProfile = fb.db.reference().child(f"account/{acc}/{page}/profile").get()
                for eventId in pagetemp:
                    eventData = pagetemp[eventId]
                    referral        = eventData['referral'] if 'referral' in eventData else None
                    if referral:
                        ad_id           = referral['ad_id']
                        socialId        = eventData['socialId']
                        channel         = eventData['channel']
                        eventName       = eventData['eventName']
                        eventTimeStamp  = eventData['eventTimeStamp']

                        temp_user_pseudo_id = func.Function.generate_uuid_from_text(socialId)
                        timeStampTransform = datetime.fromtimestamp(eventTimeStamp / 1000.0, timezone).strftime("%Y-%m-%d %H:%M:%S")
                        #Get profile data
                        profileData = fb.db.reference().child(f"account/{acc}/{page}/profile/{temp_user_pseudo_id}").get()
                        if not profileData:
                            check = False
                            for pro in pageProfile:
                                facebookPro = pageProfile[pro]['facebook']
                                for fbProfile in facebookPro:
                                    if int(fbProfile['id']) == int(socialId):
                                        temp_user_pseudo_id = socialId
                                        check = True
                                        break
                            if check:
                                #BQ process   
                                row = func.Event.pushEventFacebookAd(
                                    eventId=eventId,
                                    eventTimeStamp=timeStampTransform,
                                    eventName=eventName,
                                    id=socialId,
                                    user_pseudo_id=temp_user_pseudo_id,
                                    pageId=page,
                                    source=channel,
                                    ad_id=ad_id
                                )
                                error = bq.load_data(target_table=f"client_{acc}.facebook_ad_event", data=[row])
                                if error:
                                    logging.error(f"Error loading data to BigQuery: {error} | {eventId}")
                                else:
                                    logging.info(f"Data loaded to BigQuery for eventId: {eventId}")
                            else:
                                #Generate new user and profile
                                #Check phone id
                                # Improssible case
                                # Noti to Google chat
                                noti = func.Notify(key=os.environ.get("GOOGLE_CHAT_NOTI_KEY"))
                                noti.googleChatNotify(message=f"Error Logic: Facebook Ad flow\nNo profile data found for eventId: {eventId} with socialId: {socialId} in account: {acc} and page: {page}. Event Name: {eventName}. Please check the logic.")
                        else:
                            #BQ process
                            #craft data
                            row = func.Event.pushEventFacebookAd(
                                eventId=eventId,
                                eventTimeStamp=timeStampTransform,
                                eventName=eventName,
                                id=socialId,
                                user_pseudo_id=temp_user_pseudo_id,
                                pageId=page,
                                source=channel,
                                ad_id=ad_id
                            )
                            error = bq.load_data(target_table=f"client_{acc}.facebook_ad_event", data=[row])
                            if error:
                                logging.error(f"Error loading data to BigQuery: {error}")
                            else:
                                logging.info(f"Data loaded to BigQuery for eventId: {eventId}")
    return {"status": "success", "message": "Facebook event success"}, 200