import asyncio
import random
from datetime import datetime, timedelta
from app.database import async_session_maker
from sqlalchemy import select, func
from app.models.ride import Ride, RideStatus, RideType
from app.models.user import User, UserRole
from app.models.driver import Driver

async def seed_rides():
    async with async_session_maker() as db:
        # Check if we have rides
        count = await db.scalar(select(func.count(Ride.id)))
        if count > 5:
            print(f"Already have {count} rides. Skipping seed.")
            return

        # Get some passengers and drivers
        passengers_result = await db.execute(select(User).where(User.role == UserRole.PASSENGER).limit(5))
        passengers = passengers_result.scalars().all()
        
        drivers_result = await db.execute(select(Driver).limit(5))
        drivers = drivers_result.scalars().all()

        if not passengers or not drivers:
            print("Need passengers and drivers to seed rides.")
            return

        print(f"Seeding rides for {len(passengers)} passengers and {len(drivers)} drivers...")
        
        statuses = list(RideStatus)
        addresses = [
            "Street 123, USA", "Street 323, USA", "Broadway 456, NY", 
            "Main St 789, LA", "Maple Ave 101, CHI", "Oak Ln 202, SF"
        ]

        from app.models.payment import Payment, TransactionStatus, PaymentMethod

        for i in range(20):
            p = random.choice(passengers)
            d = random.choice(drivers)
            status = random.choice([RideStatus.COMPLETED, RideStatus.STARTED, RideStatus.ACCEPTED, RideStatus.REQUESTED])
            
            ride = Ride(
                ride_code=f"t{100 + i}",
                passenger_id=p.id,
                driver_id=d.id if status != RideStatus.REQUESTED else None,
                vehicle_category_id=1,
                ride_type=RideType.ONE_WAY,
                status=status,
                pickup_address=random.choice(addresses),
                pickup_latitude=40.7128 + random.uniform(-0.1, 0.1),
                pickup_longitude=-74.0060 + random.uniform(-0.1, 0.1),
                dropoff_address=random.choice(addresses),
                dropoff_latitude=40.7128 + random.uniform(-0.1, 0.1),
                dropoff_longitude=-74.0060 + random.uniform(-0.1, 0.1),
                estimated_distance_km=random.uniform(2, 15),
                estimated_duration_minutes=random.randint(10, 45),
                estimated_fare=random.randint(500, 3000),
                passenger_count=random.randint(1, 4),
                requested_at=datetime.utcnow() - timedelta(hours=random.randint(1, 48))
            )
            db.add(ride)
            await db.flush() # get ID

            if status == RideStatus.COMPLETED:
                fare = ride.estimated_fare
                commission = int(fare * 0.20)
                driver_amt = fare - commission
                
                payment = Payment(
                    ride_id=ride.id,
                    passenger_id=p.id,
                    driver_id=d.id,
                    subtotal=fare,
                    total=fare,
                    driver_amount=driver_amt,
                    commission_amount=commission,
                    payment_method=random.choice([PaymentMethod.CASH, PaymentMethod.CARD]),
                    status=TransactionStatus.COMPLETED,
                    paid_at=ride.requested_at + timedelta(minutes=45)
                )
                db.add(payment)
        
        await db.commit()
        print("Done seeding rides and payments.")

if __name__ == "__main__":
    asyncio.run(seed_rides())
