import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import '../core/navigation/deep_link.dart';
import '../data/app_data_scope.dart';
import '../features/learning/learning_home_page.dart';
import '../features/learning/new_in_weimar_page.dart';
import '../features/partners/partner_detail_page.dart';
import '../features/shell/deep_link_detail_page.dart';
import '../models/ad_campaign.dart';
class CampaignActionService {
const CampaignActionService._();
static Future<bool> open(BuildContext context, AdCampaign campaign) async {
final target = campaign.target;
switch (target.type) {
case CampaignTargetType.url:
return _launch(target.url ?? campaign.landingPageUrl);
case CampaignTargetType.partner:
final id = target.id;
if (id == null || id.isEmpty) return false;
final store = AppDataScope.read(context);
final lang = Localizations.localeOf(context).languageCode;
await store.load(languageCode: lang);
if (!context.mounted) return false;
try {
final partner = await store.partnerDetail(id);
if (!context.mounted) return false;
await Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => PartnerDetailPage(partner: partner)),
);
return true;
} catch (_) {
return false;
}
case CampaignTargetType.poi:
final id = target.id;
if (id == null || id.isEmpty) return false;
await Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => DeepLinkDetailPage(
deepLink: DeepLink(DeepLinkKind.poi, id: id),
),
),
);
return true;
case CampaignTargetType.tour:
final id = target.id;
if (id == null || id.isEmpty) return false;
await Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => DeepLinkDetailPage(
deepLink: DeepLink(DeepLinkKind.tour, id: id),
),
),
);
return true;
case CampaignTargetType.deepLink:
return _openDeepLink(context, target.path);
case CampaignTargetType.none:
return _launch(campaign.landingPageUrl);
}
}
static Future<bool> _openDeepLink(
BuildContext context, String? rawPath) async {
if (rawPath == null || rawPath.trim().isEmpty) return false;
final normalized =
rawPath.trim().startsWith('/') ? rawPath.trim() : '/${rawPath.trim()}';
final link = DeepLink.fromUri(Uri(fragment: normalized));
Widget? page;
switch (link.kind) {
case DeepLinkKind.learnGerman:
page = const LearningHomePage();
break;
case DeepLinkKind.newInWeimar:
page = const NewInWeimarPage();
break;
case DeepLinkKind.tour:
case DeepLinkKind.poi:
page = DeepLinkDetailPage(deepLink: link);
break;
default:
final uri = Uri.tryParse(rawPath);
if (uri != null && uri.hasScheme) return _launch(rawPath);
return false;
}
await Navigator.of(context).push(MaterialPageRoute(builder: (_) => page!));
return true;
}
static Future<bool> _launch(String? raw) async {
if (raw == null || raw.trim().isEmpty) return false;
final uri = Uri.tryParse(raw.trim());
if (uri == null) return false;
return launchUrl(uri, mode: LaunchMode.externalApplication);
}
}

