import os, sys
import requests
import dotenv

dotenv.load_dotenv()

if __name__ == "__main__": # if running as a script for individual testing
    sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

from sources.tools.tools import Tools

class FlightSearch(Tools):
    def __init__(self, api_key: str = None):
        """
        A tool to search for flight information using a flight number via AviationStack API.
        """
        super().__init__()
        self.tag = "flight_search"
        self.name = "Flight Search"
        self.description = "Search for flight information using a flight number via AviationStack API."
        self.api_key = None
        self.api_key = api_key or os.getenv("AVIATIONSTACK_API_KEY")

    def execute(self, blocks: str, safety: bool = True) -> str:
        if self.api_key is None:
            return "Error: No AviationStack API key provided."
        
        for block in blocks:
            flight_number = block.strip().lower().replace('\n', '')
            if not flight_number:
                return "Error: No flight number provided."

            try:
                url = "http://api.aviationstack.com/v1/flights"
                params = {
                    "access_key": self.api_key,
                    "flight_iata": flight_number,
                    "limit": 1
                }
                response = requests.get(url, params=params)
                response.raise_for_status()

                data = response.json()
                if "data" in data and len(data["data"]) > 0:
                    flight = data["data"][0]
                    # Extract key flight information
                    flight_status = flight.get("flight_status", "Unknown")
                    departure = flight.get("departure", {})
                    arrival = flight.get("arrival", {})
                    airline = flight.get("airline", {}).get("name", "Unknown")
                    
                    departure_airport = departure.get("airport", "Unknown")
                    departure_time = departure.get("scheduled", "Unknown")
                    arrival_airport = arrival.get("airport", "Unknown")
                    arrival_time = arrival.get("scheduled", "Unknown")

                    return (
                        f"Flight: {flight_number}\n"
                        f"Airline: {airline}\n"
                        f"Status: {flight_status}\n"
                        f"Departure: {departure_airport} at {departure_time}\n"
                        f"Arrival: {arrival_airport} at {arrival_time}"
                    )
                else:
                    return f"No flight information found for {flight_number}"
            except requests.RequestException as e:
                return f"Error during flight search: {str(e)}"
            except Exception as e:
                return f"Unexpected error: {str(e)}"
        return "No flight search performed"

    def execution_failure_check(self, output: str) -> bool:
        return output.startswith("Error") or "No flight information found" in output

    def interpreter_feedback(self, output: str) -> str:
        if self.execution_failure_check(output):
            return f"Flight search failed: {output}"
        return f"Flight information:\n{output}"


if __name__ == "__main__":
    flight_tool = FlightSearch()
    flight_number = "AA123"
    result = flight_tool.execute([flight_number], safety=True)
    feedback = flight_tool.interpreter_feedback(result)
    print(feedback)