"""Read-only public API v1 — the first, deliberately small surface for
businesses to pull catalog/order-status data into their own websites. No
order placement here yet; that's an explicit later phase, not part of this
one. Every endpoint is scoped to the calling key's owner — a key can never
see another customer's orders."""

from django.http import JsonResponse

from accounts.supabase_client import get_client
from .api_auth import require_api_key
from .pricing import get_effective_price, get_min_qty
from .truck_types import get_active_truck_types


def _account_type_for(owner_user_id):
    resp = get_client().table('pickker_customer_profiles').select('account_type').eq('user_id', owner_user_id).execute()
    return resp.data[0].get('account_type') if resp.data else None


@require_api_key
def catalog(request):
    account_type = _account_type_for(request.api_owner_user_id)
    # Not soft-deleted AND not still awaiting admin approval (see
    # market.views::fleet_create_product / _visible — same two filters,
    # duplicated rather than imported to keep this deliberately small API
    # module independent of market/views.py's much heavier import surface).
    products = (
        get_client().table('pickker_products').select('*')
        .eq('is_active', True).eq('is_approved', True)
        .execute().data
    )
    data = [
        {
            'id': p['id'],
            'name': p.get('name'),
            'category': p.get('category'),
            'unit': p.get('unit'),
            'price': float(get_effective_price(p, account_type)),
            'min_qty': get_min_qty(p, account_type),
        }
        for p in products
    ]
    return JsonResponse({'products': data})


@require_api_key
def order_status(request, order_id):
    resp = get_client().table('pickker_orders').select(
        'id, status, delivery_date, delivery_time_slot, truck_type_id, total_amount, created_at'
    ).eq('id', order_id).eq('customer_id', request.api_owner_user_id).execute()
    if not resp.data:
        return JsonResponse({'error': 'Order not found'}, status=404)
    return JsonResponse(resp.data[0])


@require_api_key
def truck_types(request):
    data = [
        {
            'id': t['id'],
            'name': t['name'],
            'capacity_label': t['capacity_label'],
            'max_weight_kg': t['max_weight_kg'],
            'base_rate': t['base_rate'],
            'icon_url': t.get('icon_url'),
        }
        for t in get_active_truck_types(segment='b2b')
    ]
    return JsonResponse({'truck_types': data})


def _fleet_company_for_key(request):
    """Resolves the calling key's owner to their fleet company, or None if
    they don't own one — every /fleet/ endpoint below 404s in that case,
    same convention as the internal fleet_dashboard views' _owned_approved_company."""
    from .fleet import get_company_for_user

    company = get_company_for_user(request.api_owner_user_id)
    if not company or not company['is_approved']:
        return None
    return company


@require_api_key
def fleet_trucks(request):
    from .fleet import get_company_drivers, get_company_trucks
    from .views import get_fleet_live_positions

    company = _fleet_company_for_key(request)
    if not company:
        return JsonResponse({'error': 'Not a fleet company'}, status=404)

    trucks = get_company_trucks(company['id'])
    drivers = get_company_drivers(company['id'])
    positions_by_driver = {p['driver_id']: p for p in get_fleet_live_positions(company)}

    data = []
    for truck in trucks:
        assigned_driver = next((d for d in drivers if d.get('truck_id') == truck['id']), None)
        position = positions_by_driver.get(assigned_driver['user_id']) if assigned_driver else None
        data.append({
            'id': truck['id'],
            'nickname': truck.get('nickname'),
            'license_plate': truck.get('license_plate'),
            'is_active': truck['is_active'],
            'truck_type_id': truck['truck_type_id'],
            'assigned_driver_id': assigned_driver['user_id'] if assigned_driver else None,
            'live_position': {'lat': position['lat'], 'lng': position['lng'], 'order_id': position['order_id'], 'order_status': position['order_status']} if position else None,
        })
    return JsonResponse({'trucks': data})


@require_api_key
def fleet_orders(request):
    from .fleet import get_company_driver_ids
    from .fleet_earnings import get_company_orders

    company = _fleet_company_for_key(request)
    if not company:
        return JsonResponse({'error': 'Not a fleet company'}, status=404)

    driver_ids = get_company_driver_ids(company['id'])
    return JsonResponse({'orders': get_company_orders(driver_ids)})


@require_api_key
def fleet_earnings(request):
    from .fleet import get_company_driver_ids
    from .fleet_earnings import get_company_earnings_summary

    company = _fleet_company_for_key(request)
    if not company:
        return JsonResponse({'error': 'Not a fleet company'}, status=404)

    driver_ids = get_company_driver_ids(company['id'])
    summary = get_company_earnings_summary(driver_ids)
    return JsonResponse({
        'pending_amount': float(summary['pending_amount']),
        'pending_count': summary['pending_count'],
        'paid_amount': float(summary['paid_amount']),
        'lifetime_amount': float(summary['lifetime_amount']),
    })
