#!/usr/bin/env python3
"""
Simple Query Interface for Vehicle Database
Provides a command-line interface for searching the vehicle database
"""

import sqlite3
from typing import List, Tuple


class VehicleQueryInterface:
    def __init__(self, db_path: str = "vehicle_database.db"):
        self.db_path = db_path
    
    def search_vehicles(self, brand: str = None, model: str = None, year: int = None, 
                        engine: str = None, limit: int = 50) -> List[Tuple]:
        """Search for vehicles based on various criteria"""
        conn = sqlite3.connect(self.db_path)
        conn.row_factory = sqlite3.Row  # Enable column access by name
        cursor = conn.cursor()
        
        query = """
            SELECT 
                b.name AS brand,
                m.name AS model,
                y.year,
                e.name AS engine,
                e.displacement_cc,
                e.cylinders,
                e.fuel_type,
                e.power_hp,
                mye.trim_level,
                mye.drivetrain,
                mye.transmission
            FROM model_year_engine mye
            JOIN models m ON mye.model_id = m.id
            JOIN brands b ON m.brand_id = b.id
            JOIN years y ON mye.year_id = y.id
            JOIN engines e ON mye.engine_id = e.id
            WHERE 1=1
        """
        
        params = []
        if brand:
            query += " AND b.name LIKE ?"
            params.append(f"%{brand}%")
        if model:
            query += " AND m.name LIKE ?"
            params.append(f"%{model}%")
        if year:
            query += " AND y.year = ?"
            params.append(year)
        if engine:
            query += " AND e.name LIKE ?"
            params.append(f"%{engine}%")
        
        query += f" ORDER BY b.name, m.name, y.year LIMIT {limit}"
        
        cursor.execute(query, params)
        results = cursor.fetchall()
        conn.close()
        
        return results
    
    def get_all_brands(self) -> List[Tuple]:
        """Get a list of all brands in the database"""
        conn = sqlite3.connect(self.db_path)
        conn.row_factory = sqlite3.Row
        cursor = conn.cursor()
        
        cursor.execute("SELECT DISTINCT name FROM brands ORDER BY name")
        results = cursor.fetchall()
        conn.close()
        
        return [row[0] for row in results]
    
    def get_models_by_brand(self, brand_name: str) -> List[Tuple]:
        """Get all models for a specific brand"""
        conn = sqlite3.connect(self.db_path)
        conn.row_factory = sqlite3.Row
        cursor = conn.cursor()
        
        cursor.execute("""
            SELECT DISTINCT m.name 
            FROM models m
            JOIN brands b ON m.brand_id = b.id
            WHERE b.name = ?
            ORDER BY m.name
        """, (brand_name,))
        results = cursor.fetchall()
        conn.close()
        
        return [row[0] for row in results]
    
    def get_years_for_model(self, model_name: str) -> List[int]:
        """Get all years for a specific model"""
        conn = sqlite3.connect(self.db_path)
        conn.row_factory = sqlite3.Row
        cursor = conn.cursor()
        
        cursor.execute("""
            SELECT DISTINCT y.year
            FROM model_year_engine mye
            JOIN models m ON mye.model_id = m.id
            JOIN years y ON mye.year_id = y.id
            WHERE m.name = ?
            ORDER BY y.year
        """, (model_name,))
        results = cursor.fetchall()
        conn.close()
        
        return [row[0] for row in results]


def main():
    interface = VehicleQueryInterface()
    
    print("Vehicle Database Query Interface")
    print("=================================")
    
    while True:
        print("\nOptions:")
        print("1. Search vehicles")
        print("2. List all brands")
        print("3. List models for a brand")
        print("4. List years for a model")
        print("5. Exit")
        
        choice = input("\nEnter your choice (1-5): ").strip()
        
        if choice == "1":
            print("\nSearch for vehicles:")
            brand = input("Brand (optional): ").strip() or None
            model = input("Model (optional): ").strip() or None
            year_input = input("Year (optional): ").strip()
            year = int(year_input) if year_input else None
            engine = input("Engine (optional): ").strip() or None
            
            results = interface.search_vehicles(brand=brand, model=model, year=year, engine=engine)
            
            if results:
                print(f"\nFound {len(results)} result(s):")
                print("-" * 100)
                for i, vehicle in enumerate(results, 1):
                    print(f"{i:2d}. {vehicle['year']} {vehicle['brand']} {vehicle['model']}")
                    print(f"    Engine: {vehicle['engine']} ({vehicle['power_hp']} HP, {vehicle['displacement_cc']} cc)")
                    print(f"    Trim: {vehicle['trim_level']}, Drivetrain: {vehicle['drivetrain']}, Transmission: {vehicle['transmission']}")
                    print()
            else:
                print("No vehicles found matching your criteria.")
        
        elif choice == "2":
            brands = interface.get_all_brands()
            print(f"\nAll brands ({len(brands)}):")
            for i, brand in enumerate(brands, 1):
                print(f"{i:2d}. {brand}")
        
        elif choice == "3":
            brand = input("Enter brand name: ").strip()
            if brand:
                models = interface.get_models_by_brand(brand)
                if models:
                    print(f"\nModels for {brand} ({len(models)}):")
                    for i, model in enumerate(models, 1):
                        print(f"{i:2d}. {model}")
                else:
                    print(f"No models found for brand: {brand}")
            else:
                print("Please enter a brand name.")
        
        elif choice == "4":
            model = input("Enter model name: ").strip()
            if model:
                years = interface.get_years_for_model(model)
                if years:
                    print(f"\nYears for {model} ({len(years)}):")
                    for i, year in enumerate(years, 1):
                        print(f"{i:2d}. {year}")
                else:
                    print(f"No years found for model: {model}")
            else:
                print("Please enter a model name.")
        
        elif choice == "5":
            print("Thank you for using the Vehicle Database Query Interface!")
            break
        
        else:
            print("Invalid choice. Please enter 1-5.")


if __name__ == "__main__":
    main()