from fastapi import Request, Query, Depends, Header, APIRouter, HTTPException
from fastapi.responses import JSONResponse
import pytz
import os
import uuid
from datetime import datetime, timedelta
from connectors.firebase.firebase import Firebase
import utility.function as func

import logging
logging.basicConfig(level=logging.INFO)
timezone_utc = pytz.utc
timezone_bkk = pytz.timezone('Asia/Bangkok')

fb = Firebase(host=os.environ.get("FIREBASE_HOST"))

router = APIRouter()

LOGGING_PREFIX = "api_job_ad"

@router.post("/facebook/ad/event", description="Process Facebook Ad Events")
async def post_api_job_ad_facebook_event(default_request: Request):
    try:
        from connectors.bigquery.bq import BigQuery
        bq = BigQuery()

        dateStr = datetime.now(timezone_bkk).date().strftime("%Y%m%d")
        hourStr = (datetime.now(timezone_bkk) - 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_bkk).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 JSONResponse(status_code=200, content={"status": "ok", "message": "Facebook event success"})
    except Exception as e:
        logging.error(f"Error parsing {LOGGING_PREFIX}: {e}")
        return JSONResponse(status_code=500, content={'status': 'error', 'message': str(e)})