import 'package:timezone/timezone.dart' as tz; enum UiTimeZoneType { ro, local, utc, iana, } extension UITimeZoneTypeName on UiTimeZoneType { String get userInterfaceName => (const { UiTimeZoneType.iana: 'Fus orar IANA', UiTimeZoneType.local: 'Local', UiTimeZoneType.ro: 'România', UiTimeZoneType.utc: 'UTC', })[this]!; } const Map fromSerStringConstructors = { UiTimeZoneType.ro: RoUiTimeZone.fromSerString, UiTimeZoneType.local: LocalUiTimeZone.fromSerString, UiTimeZoneType.utc: UtcUiTimeZone.fromSerString, UiTimeZoneType.iana: IanaUiTimeZone.fromSerString, }; abstract class UiTimeZone { final UiTimeZoneType type; const UiTimeZone({required this.type}); DateTime convertDateTime(DateTime dt); factory UiTimeZone.fromSerString(String ser) { final arr = ser.split('\n'); return fromSerStringConstructors.map((key, value) => MapEntry(key.name, value))[arr[0]]!(ser); } String toSerString() { return '${type.name}\n'; } } class RoUiTimeZone extends UiTimeZone { static final roTz = tz.getLocation('Europe/Bucharest'); const RoUiTimeZone() : super(type: UiTimeZoneType.ro); factory RoUiTimeZone.fromSerString(String ser) => const RoUiTimeZone(); @override DateTime convertDateTime(DateTime dt) { return tz.TZDateTime.from(dt, roTz); } } class LocalUiTimeZone extends UiTimeZone { const LocalUiTimeZone() : super(type: UiTimeZoneType.local); factory LocalUiTimeZone.fromSerString(String ser) => LocalUiTimeZone(); @override DateTime convertDateTime(DateTime dt) => dt.toLocal(); } class UtcUiTimeZone extends UiTimeZone { const UtcUiTimeZone() : super(type: UiTimeZoneType.utc); factory UtcUiTimeZone.fromSerString(String ser) => UtcUiTimeZone(); @override DateTime convertDateTime(DateTime dt) => dt.toUtc(); } class IanaUiTimeZone extends UiTimeZone { late final tz.Location location; IanaUiTimeZone({required String ianaName}): super(type: UiTimeZoneType.iana) { location = tz.getLocation(ianaName); } factory IanaUiTimeZone.fromSerString(String ser) => IanaUiTimeZone( ianaName: ser.split('\n').skip(1).join('\n'), ); @override DateTime convertDateTime(DateTime dt) { return tz.TZDateTime.from(dt, location); } @override String toSerString() { return '${type.name}\n${location.name}'; } }