from flask import Blueprint, request
import logging
import os
from firebase.firebase import Firebase
logging.basicConfig(level=logging.INFO)

conversation_analytics = Blueprint('conversation_analytics', __name__, url_prefix='/feature/conversation_analytics')
fb = Firebase(host=os.environ.get("FIREBASE_HOST"))

@conversation_analytics.route('/agent',  methods=['GET','POST'])
@conversation_analytics.route('/agent/',  methods=['GET','POST'])
def conversation_analytics_agent():
    from feature.conversation_analytics.src.agent import Agent
    try:
        if request.method == 'POST':
            data = request.get_json()
            for req in ['property_id', 'display_name', 'description', 'system_instruction']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            
            property_id = data.get("property_id")
            display_name = data.get("display_name")
            description = data.get("description")
            system_instruction = data.get("system_instruction")
            

            #Create Agent
            agent = Agent(property_id=property_id)
            created = agent.create_agent(
                display_name=display_name,
                description=description,
                system_instruction=system_instruction
            )
            if not created:
                return {'status': 'error', 'message': 'Failed to create agent'}, 500
            return {'status': 'success', 'message': 'Agent created successfully'}, 201

        elif request.method == 'GET':
            property_id = request.args.get("property_id")
            if not property_id:
                return {'message': "property_id is require"}, 400    
            agent = Agent(property_id=property_id)
            pack_agent, agents = agent.get_agent()
            if not pack_agent:
                return {'status': 'error', 'message': 'No agents found'}, 404
            return {'status': 'success', 'data': pack_agent}, 200
        
        return {'status': 'error', 'message': 'Method not allowed'}, 405
    except Exception as e:
        logging.error(e)
        return {'status': 'error', 'message': str(e)}, 500
    
@conversation_analytics.route('/conversation',  methods=['GET','POST', 'PUT'])
@conversation_analytics.route('/conversation/',  methods=['GET','POST', 'PUT'])
def conversation_analytics_conversation():
    try:
        from feature.conversation_analytics.src.agent import Agent
        from feature.conversation_analytics.src.conversations import Conversations

        if request.method == 'POST':
            data = request.get_json()
            for req in ['property_id', 'agent_id']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            
            property_id = data.get("property_id")
            agent_id = data.get("agent_id")
            conversation_name = data.get("conversation_name", "Untitled Conversation")
            
            #Get Agent
            agent_instance = Agent(property_id=property_id)
            _, agents = agent_instance.get_agent()
            agent = next((a for a in agents if a.name == agent_id), None)
            if not agent:
                return {'status': 'error', 'message': 'Agent not found'}, 404
            #Create Conversation
            conver = Conversations(property_id=property_id, agent=agent)
            convo = conver.create_conversation()
            if not convo:
                return {'status': 'error', 'message': 'Failed to create conversation'}, 500
            
            #Save to Firebase
            fb_path = f"account/{property_id}/conversations/{convo.name}"
            fb.db.reference(fb_path).set(
                {
                    "conversation_name": conversation_name,
                    "conversation_id": convo.name,
                    "agent_id": agent_id,
                    "created_at": str(convo.create_time),
                    "updated_at": str(convo.last_used_time)
                }
            )
            return {'status': 'success', 'message': 'Conversation created successfully', 'data': {'conversation_name': convo.name}}, 201
        
        elif request.method == 'GET':
            data = request.args
            for req in ['property_id', 'agent_id']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            property_id = data.get("property_id")
            agent_id = data.get("agent_id")
            
            if not property_id or not agent_id:
                return {'message': "property_id and agent_id are require"}, 400    
            
            #Get Agent
            agent_instance = Agent(property_id=property_id)
            _, agents = agent_instance.get_agent()
            agent = next((a for a in agents if a.name == agent_id), None)
            if not agent:
                return {'status': 'error', 'message': 'Agent not found'}, 404
            #Fetch Conversations
            conver = Conversations(property_id=property_id, agent=agent)
            convos = conver.fetch_convos()
            if not convos:
                return {'status': 'error', 'message': 'No conversations found'}, 404
            
            #Mapping conversations with Firebase data
            convo_list = []
            for convo in convos:
                fb_path = f"account/{property_id}/conversations/{convo.name}"
                fb_data = fb.db.reference(fb_path).get()
                convo_list.append({
                    "conversation_name": fb_data.get("conversation_name") if fb_data else "Unknown",
                    "agent_id": agent_id,
                    "conversation_id": convo.name,
                    "created_at": str(convo.create_time),
                    "updated_at": str(convo.last_used_time)
                })
            
            return {'status': 'success', 'data': convo_list}, 200
        
        elif request.method == 'PUT':
            #Only rename conversation
            data = request.get_json()
            for req in ['property_id', 'agent_id', 'conversation_id', 'new_conversation_name']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            
            property_id = data.get("property_id")
            agent_id = data.get("agent_id")
            conversation_id = data.get("conversation_id")
            new_conversation_name = data.get("new_conversation_name")

            #Update in Firebase
            fb_path = f"account/{property_id}/conversations/{conversation_id}/conversation_name"
            fb.db.reference(fb_path).set(new_conversation_name)
            return {'status': 'success', 'message': 'Conversation renamed successfully'}, 200
        
        return {'status': 'error', 'message': 'Method not allowed'}, 405
            
    except Exception as e:
        logging.error(e)
        return {'status': 'error', 'message': str(e)}, 500
    
@conversation_analytics.route('/conversation/message',  methods=['GET','POST'])
@conversation_analytics.route('/conversation/message/',  methods=['GET','POST'])
def conversation_analytics_conversation_message():
    try:
        from feature.conversation_analytics.src.agent import Agent
        from feature.conversation_analytics.src.conversations import Conversations
        from feature.conversation_analytics.src.utils import message_handle

        if request.method == 'POST':
            data = request.get_json()
            for req in ['property_id', 'agent_id', 'conversation_id', 'user_input']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            
            property_id = data.get("property_id")
            agent_id = data.get("agent_id")
            conversation_id = data.get("conversation_id")
            user_input = data.get("user_input")
            
            #Sent message to Agent
            agent_instance = Agent(property_id=property_id)
            _, agents = agent_instance.get_agent()
            agent = next((a for a in agents if a.name == agent_id), None)
            if not agent:
                return {'status': 'error', 'message': 'Agent not found'}, 404
            #Fetch Messages
            conver = Conversations(property_id=property_id, agent=agent)
            convo_refs = conver.fetch_convos()
            convo = next((c for c in convo_refs if c.name == conversation_id), None)
            message_data = conver.add_message(convo=convo, user_input=user_input)
            if not message_data:
                return {'status': 'error', 'message': 'Failed to add message'}, 500
            
            #Save to Firebase
            fb_path = f"account/{property_id}/conversations/{conversation_id}/messages"
            
            #Check last index
            messages = fb.db.reference(fb_path).get(shallow=True)
            if messages:
                last_index = max(int(k) for k in messages.keys())
                new_index = last_index + 1
            else:
                new_index = 0
                
            # Add user message
            user_mes ={
                "type":"user_message",
                "message": str(user_input)
            }
            fb.db.reference(fb_path).child(str(new_index)).set(user_mes)
            #Add system message
            for mes in message_data:
                new_index += 1
                fb.db.reference(fb_path).child(str(new_index)).set(mes)
            
            return {'status': 'success', 'data': message_data}, 201 
        
        elif request.method == 'GET':
            data = request.args
            for req in ['property_id', 'agent_id', 'conversation_id']:
                if req not in data:
                    return {'message': f"{req} is require"}, 400
            property_id = data.get("property_id")
            agent_id = data.get("agent_id")
            conversation_id = data.get("conversation_id")
            if not property_id or not agent_id or not conversation_id:
                return {'message': "property_id, agent_id and conversation_id are require"}, 400
            
            #Check in Firebase
            fb_path = f"account/{property_id}/conversations/{conversation_id}/messages"
            messages = fb.db.reference(fb_path).get()
            if not messages:
                return {'status': 'error', 'message': 'No messages found in Firebase'}, 404
            return {'status': 'success', 'data': messages}, 200
            
            # #Get Agent
            # agent_instance = Agent(property_id=property_id)
            # _, agents = agent_instance.get_agent()
            # agent = next((a for a in agents if a.name == agent_id), None)
            # if not agent:
            #     return {'status': 'error', 'message': 'Agent not found'}, 404
            # #Fetch Messages
            # conver = Conversations(property_id=property_id, agent=agent)
            # message_data, convo_messages = conver.fetch_messages(convo=conversation_id)
            # if not convo_messages:
            #     return {'status': 'error', 'message': 'No messages found'}, 404
            # return {'status': 'success', 'data': message_data}, 200
            
        return {'status': 'error', 'message': 'Method not allowed'}, 405
            
    except Exception as e:
        logging.error(e)
        return {'status': 'error', 'message': str(e)}, 500