import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
import 'package:immich_mobile/utils/debug_print.dart';

@RoutePage()
class DriftPartnerDetailPage extends StatelessWidget {
  final PartnerUserDto partner;

  const DriftPartnerDetailPage({super.key, required this.partner});

  @override
  Widget build(BuildContext context) {
    return ProviderScope(
      overrides: [
        timelineServiceProvider.overrideWith((ref) {
          final timelineService = ref.watch(timelineFactoryProvider).remoteAssets(partner.id);
          ref.onDispose(timelineService.dispose);
          return timelineService;
        }),
      ],
      child: Timeline(
        appBar: MesmerizingSliverAppBar(title: partner.name, icon: Icons.person_outline),
        topSliverWidget: _InfoBox(partner: partner),
        topSliverWidgetHeight: 110,
        bottomSheet: const PartnerDetailBottomSheet(),
      ),
    );
  }
}

class _InfoBox extends ConsumerStatefulWidget {
  final PartnerUserDto partner;

  const _InfoBox({required this.partner});

  @override
  ConsumerState<_InfoBox> createState() => _InfoBoxState();
}

class _InfoBoxState extends ConsumerState<_InfoBox> {
  bool _inTimeline = false;

  @override
  void initState() {
    super.initState();
    _inTimeline = widget.partner.inTimeline;
  }

  _toggleInTimeline() async {
    final user = ref.read(currentUserProvider);
    if (user == null) {
      return;
    }

    try {
      await ref.read(partnerUsersProvider.notifier).toggleShowInTimeline(widget.partner.id, user.id);

      setState(() {
        _inTimeline = !_inTimeline;
      });
    } catch (error, stack) {
      dPrint(() => "Failed to toggle in timeline: $error $stack");
      ImmichToast.show(
        context: context,
        toastType: ToastType.error,
        durationInSecond: 1,
        msg: "Failed to toggle the timeline setting",
      );
      return;
    }
  }

  @override
  Widget build(BuildContext context) {
    return SliverToBoxAdapter(
      child: SizedBox(
        height: 110,
        child: Padding(
          padding: const EdgeInsets.only(left: 8.0, right: 8.0, top: 16.0),
          child: Container(
            decoration: BoxDecoration(
              border: Border.all(color: context.colorScheme.onSurface.withAlpha(10), width: 1),
              borderRadius: const BorderRadius.all(Radius.circular(20)),
              gradient: LinearGradient(
                colors: [context.colorScheme.primary.withAlpha(10), context.colorScheme.primary.withAlpha(15)],
                begin: Alignment.topCenter,
                end: Alignment.bottomCenter,
              ),
            ),
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: ListTile(
                title: Text(
                  "Show in timeline",
                  style: context.textTheme.titleSmall?.copyWith(color: context.colorScheme.primary),
                ),
                subtitle: Text(
                  "Show photos and videos from this user in your timeline",
                  style: context.textTheme.bodyMedium,
                ),
                trailing: Switch(value: _inTimeline, onChanged: (_) => _toggleInTimeline()),
              ),
            ),
          ),
        ),
      ),
    );
  }
}
