from flask import Blueprint, request, Response
import logging
import uuid
import pytz
import json

import pandas as pd
import numpy as np
from google.cloud import bigquery
from firebase.firebase import Firebase
from collections import Counter
from datetime import datetime, timedelta
from bigquery.bq import BigQuery, Table
from bigquery.media import MediaBigQuery
from utility.function import Function, Pack, Key, Profile
from utility.media import Facebook
from utility.token import Token

logging.basicConfig(level=logging.INFO)

feature_facebook = Blueprint('feature_facebook', __name__, url_prefix='/feature/facebook')
fb = Firebase(host="https://ydm-profile-360-default-rtdb.asia-southeast1.firebasedatabase.app/")
timezone = pytz.timezone('Asia/Bangkok')

@feature_facebook.route('/get_msg_summary', methods=['GET','POST','DELETE'])
def get_msg_summary():
    property = fb.db.reference(f'property')
    all_property = property.get()
    
    # Loop to get a pairs of property_id and facebook_page_id
    property_facebook_pairs = []
    for property_id, account_data in all_property.items():
        property_id = property_id
        facebook_channels = fb.db.reference(f'property/{property_id}/channel/facebook').get()
        for page_id in facebook_channels.keys():
            property_facebook_pairs.append({
                "property_id": property_id,
                "facebook_page_id": page_id
            })
    
    pages = Facebook.get_all_page()
    access_token_map = {page['id']: page['access_token'] for page in pages}

    # Update original list with access token if matched
    property_facebook_pairs = [
        {**entry, 'access_token': access_token_map[entry['facebook_page_id']]}
        for entry in property_facebook_pairs
        if entry['facebook_page_id'] in access_token_map
    ]
            
    FIELDS = "message_count,name,unread_count,updated_time,can_reply,id,snippet,former_participants,participants,messages.limit(10){message,attachments{image_data,video_data,id,file_url},from,created_time}"
    LIMIT = 100
    
    Facebook.update_msg_summary(property_facebook_pairs, FIELDS, LIMIT, fb)
    return {"status":"Update chat data to Firebase successfully"}, 200

@feature_facebook.route('/get_fb_ads_insight', methods=['POST'])
def get_fb_ads_insight():
    
    property_list = list(fb.db.reference('property').get().keys())
    bq = BigQuery()
    for property_id in property_list:
        
        if fb.db.reference(f'property/{property_id}/adaccount/facebook').get() is not None:
            
            start = (datetime.now() - timedelta(days=15)).strftime('%Y-%m-%d')
            end = datetime.now().strftime('%Y-%m-%d')
            fb_adaccount_list = list(fb.db.reference(f'property/{property_id}/adaccount/facebook').get().keys())
            fb_adaccount_where = ', '.join([f'\"{x}\"' for x in fb_adaccount_list])
            
            facebook_query = MediaBigQuery.facebook_single_view_query(fb_adaccount_where,start,end)
            
            # -- Check if schema exists
            media_single_schema = Table.tableMediaSingleData()
            bq.ensure_table(f"customer-360-profile.client_{property_id}.media_single_data",media_single_schema)
            bq.ensure_table(f"customer-360-profile.client_{property_id}.media_single_data_temp",media_single_schema)
            
            fb_media_df = bq.get_query_df(facebook_query)
            obj_numeric = [
                "cost","impression","clicks","view","video_play_action",
                "video_view_25","video_view_50","video_view_75","video_view_100"
            ]
            fb_media_df[obj_numeric] = fb_media_df[obj_numeric].astype('float')
            
            bq.delete_data("customer-360-profile",f"client_{property_id}","media_single_data_temp")
            bq.load_data_df(f"client_{property_id}","media_single_data_temp",fb_media_df)
            bq.delete_when_match("customer-360-profile",f"client_{property_id}","media_single_data",f"client_{property_id}","media_single_data_temp",
                                "ON ori.date = temp.date AND ori.account_id = temp.account_id AND ori.ad_id = temp.ad_id ")
            bq.load_data_df(f"client_{property_id}","media_single_data",fb_media_df)
    
    return {"status":"Update Facebook Ads Insight to BigQuery successfully"}, 200