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
import uuid
from feature.automation.node import *
logging.basicConfig(level=logging.INFO)

automation_scheduled = Blueprint('automation_scheduled', __name__, url_prefix='/automation/scheduled')

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

def transform_logs(nodes):
    result = []

    for node in nodes:
        base = {
            "node_id": node["node_id"],
            "node_name": node["name"],
            "type": node["type"],
            "timestamp": node["timestamp"],
        }

        # CASE 1: Cron Trigger
        if node["type"] == "trigger":
            result.append({
                **base,
                "user_pseudo_id": None,
                "action": "triggered",
                "status": node.get("triggered"),
            })

        # CASE 2: Audience segment
        elif node["type"] == "audience":
            for uid in node["user_pseudo_ids"]:
                result.append({
                    **base,
                    "user_pseudo_id": uid,
                    "action": "audience_match",
                    "status": True,
                })

        # CASE 3: Destination (success / fail per user)
        elif node["type"] == "destination":
            # Success
            for uid in node.get("user_pseudo_ids_success", []):
                result.append({
                    **base,
                    "user_pseudo_id": uid,
                    "action": "send_message",
                    "status": "success",
                })

            # Fail
            for uid in node.get("user_pseudo_ids_fail", []):
                result.append({
                    **base,
                    "user_pseudo_id": uid,
                    "action": "send_message",
                    "status": "fail",
                })
    return result

@automation_scheduled.route('/',  methods=['POST'])
@automation_scheduled.route('',  methods=['POST'])
def automation_scheduled_func():
    try:
        now = datetime.now(timezone).replace(second=0, microsecond=0)
        accounts = fb.db.reference().child('account').get(shallow=True)
        for acc in accounts:
            activeAutomate = fb.db.reference().child(f"account/{acc}/automation_active_index").get()
            if not activeAutomate:
                print(f"No active automate for account {acc}")
                continue
            
            for automate_id in activeAutomate:
                automate = fb.db.reference().child(f"account/{acc}/automation/{automate_id}").get()
                last_triggered = automate.get('last_triggered')
                automateJSON = automate.get('json')
                startingNode = automateJSON.get('starting_node')
                automateNodes = automateJSON.get('nodes')
                
                should_trigger_now = False
                for node in automateNodes:
                    if node.get('id') == startingNode:
                        trigNode = TriggerNode(node["id"], node["name"], node['trigger'], node.get("cron",None), node.get("interval",None), last_triggered, now, node['datebegin'], node['dateend'], node['alwaywhen'])
                        should_trigger_now = trigNode.should_trigger_now()
                        if not should_trigger_now:
                            break
                
                if should_trigger_now:
                    executor = FlowExecutor(acc, automate, now)
                    result = executor.execute()
                    
                    #Save result
                    fb.db.reference().child(f"account/{acc}/automation/{automate_id}/last_triggered").set(now.strftime("%Y-%m-%d %H:%M:00"))
                    
                    resultObject = {
                        "log_id": str(uuid.uuid4()),
                        "logs": result
                    }
                    #Get logs
                    logs = fb.db.reference().child(f"account/{acc}/automation/{automate_id}/logs").get()
                    logs = [] if not logs else logs
                    logs.append(resultObject)
                    fb.db.reference().child(f"account/{acc}/automation/{automate_id}/logs").set(logs)
        return {'status': 'success'}, 200
    except Exception as e:
        logging.error(f"Error in automation_scheduled_func: {e}")
        return {'status': 'error', 'message': str(e)}, 500
    
@automation_scheduled.route('/v2',  methods=['POST'])
@automation_scheduled.route('/v2/',  methods=['POST'])
def automation_scheduled_func_v2():
    try:
        now = datetime.now(timezone).replace(second=0, microsecond=0)
        nowStr = now.strftime("%Y-%m-%d %H:%M:00")
        from dashboard.genQuery import GenerateQuery
        from utility.cloudsql import CloudSQL
        csql = CloudSQL("asia-southeast1", os.environ.get("INSTANCE_NAME"))
        csql.create_engine(os.environ.get("POSTGRES_USER"), os.environ.get("POSTGRES_PASSWORD"), os.environ.get("POSTGRES_DB"))
        
        accounts = fb.db.reference().child('account').get(shallow=True)
        for acc in accounts:
            genq = GenerateQuery(acc)
            query = genq.schedualAutomation(nowStr)
            resultQuery = csql.query(query)
            if not resultQuery:
                continue
            for automateRow in resultQuery:
                automation_id = automateRow[2]
                log_id = automateRow[0]
                #Get autoamte
                automate = fb.db.reference().child(f"account/{acc}/automation/{automation_id}").get()
                # last_triggered = automate.get('last_triggered')
                # automateJSON = automate.get('json')
                # startingNode = automateJSON.get('starting_node')
                # automateNodes = automateJSON.get('nodes')
                
                # should_trigger_now = False
                # for node in automateNodes:
                #     if node.get('id') == startingNode:
                #         trigNode = TriggerNode(node["id"], node["name"], node['trigger'], node.get("cron",None), node.get("interval",None), last_triggered, now, node['datebegin'], node['dateend'], node['alwaywhen'])
                #         should_trigger_now = trigNode.should_trigger_now()
                #         if not should_trigger_now:
                #             break
                
                # if should_trigger_now:
                executor = FlowExecutor(acc, automate, now)
                result = executor.execute()
                
                #Save result
                fb.db.reference().child(f"account/{acc}/automation/{automation_id}/last_triggered").set(nowStr)
                
                resultObject = {
                    "log_id": log_id,
                    "logs": result
                }
                #Get logs
                logs = fb.db.reference().child(f"account/{acc}/automation/{automation_id}/logs").get(shallow=True)
                if not logs:
                    max_key = -1
                else:
                    max_key = max(int(k) for k in logs)
                # logs.append(resultObject)
                # fb.db.reference().child(f"account/{acc}/automation/{automation_id}/logs").set(logs)

                #Update Postgres
                queryUpdateLog = genq.updateAutomationLog(automation_id, log_id)
                resultUpdate = csql.query(queryUpdateLog)

                #Log user data to Postgres
                ## Start with result
                logs_transform = transform_logs(result)
                fb.db.reference().child(f"account/{acc}/automation/{automation_id}/logs/{log_id}/data/{int(max_key)+1}").set(logs_transform)
                fb.db.reference().child(f"account/{acc}/automation/{automation_id}/logs/{log_id}/timestamp").set(nowStr)

        return {'status': 'success'}, 200      
    except Exception as e:
        logging.error(f"Error in automation_scheduled_func: {e}")
        return {'status': 'error', 'message': str(e)}, 500