import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';

import '../auth/auth_provider.dart';
import '../auth/login_screen.dart';
import '../auth/server_url_screen.dart';
import '../library/album_detail_screen.dart';
import '../library/artist_detail_screen.dart';
import '../library/home_screen.dart';
import '../player/now_playing_screen.dart';
import '../player/player_bar.dart';
import 'widgets/version_gate.dart';

/// Exposed as a Provider so its single argument is a real `Ref` (the
/// constructor's redirect closures use `ref.read`). Widgets consume the
/// router via `ref.watch(routerProvider)` instead of constructing it
/// themselves with a `WidgetRef`, which can't satisfy the `Ref` type.
final routerProvider = Provider<GoRouter>((ref) => buildRouter(ref));

GoRouter buildRouter(Ref ref) {
  return GoRouter(
    initialLocation: '/',
    redirect: (ctx, state) async {
      final url = await ref.read(serverUrlProvider.future);
      if (url == null) return '/server-url';
      final user = await ref.read(authControllerProvider.future);
      final loc = state.matchedLocation;
      if (user == null && loc != '/login' && loc != '/server-url') {
        return '/login';
      }
      if (user != null && (loc == '/login' || loc == '/server-url')) {
        return '/home';
      }
      return null;
    },
    routes: [
      GoRoute(path: '/', redirect: (_, __) => '/home'),
      GoRoute(path: '/server-url', builder: (_, __) => const ServerUrlScreen()),
      GoRoute(path: '/login',      builder: (_, __) => const LoginScreen()),
      ShellRoute(
        builder: (ctx, state, child) => VersionGate(child: _ShellWithPlayerBar(child: child)),
        routes: [
          GoRoute(path: '/home', builder: (_, __) => const HomeScreen()),
          GoRoute(
            path: '/artists/:id',
            builder: (_, s) => ArtistDetailScreen(id: s.pathParameters['id']!),
          ),
          GoRoute(
            path: '/albums/:id',
            builder: (_, s) => AlbumDetailScreen(id: s.pathParameters['id']!),
          ),
          GoRoute(path: '/now-playing', builder: (_, __) => const NowPlayingScreen()),
        ],
      ),
    ],
  );
}

class _ShellWithPlayerBar extends StatelessWidget {
  const _ShellWithPlayerBar({required this.child});
  final Widget child;
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Expanded(child: child),
        const PlayerBar(),
      ],
    );
  }
}

