import 'package:comwell_key_app/utils/json.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';

part '../../.generated/domain/models/notification_permission.g.dart';

enum NotificationPermissionType {
  b2bNewsletter("b2bmarketingnewsletter"),
  ccEmail("ccmarketingemail"),
  ccDigital("ccmarketingdigi"),
  ccSms("ccmarketingsms"),
  b2bDigital("b2bmarketingdigi"),
  companyEmail("companymarketingemail"),
  companyNotifications("companymarketingnewsletter"),
  stayEmails("staymarketingemail"),
  appNotifications("ccmarketingapp"),
  similarProducts("similarproducts");

  final String code;

  const NotificationPermissionType(this.code);

  String localizedDisplayName(BuildContext context) {
    switch (this) {
      case NotificationPermissionType.b2bNewsletter:
        return 'B2B Newsletter';
      case NotificationPermissionType.ccEmail:
        return 'CC Email Permission';
      case NotificationPermissionType.ccDigital:
        return 'CC Digital Permission';
      case NotificationPermissionType.ccSms:
        return 'CC SMS Permission';
      case NotificationPermissionType.b2bDigital:
        return 'B2B Digital permission';
      case NotificationPermissionType.companyEmail:
        return 'Company Email permission';
      case NotificationPermissionType.companyNotifications:
        return 'Comm. Pref: Company Notifications';
      case NotificationPermissionType.stayEmails:
        return 'Comm. Pref: Stay Emails';
      case NotificationPermissionType.appNotifications:
        return 'Comm. Pref: App notifications';
      case NotificationPermissionType.similarProducts:
        return 'Similar products permissions';
    }
  }

  // Not all permissions are used so some of the descriptions are not implemented
  String description(BuildContext context) {
    switch (this) {
      case NotificationPermissionType.b2bNewsletter:
        return context.strings.company_deal_subtitle;
      case NotificationPermissionType.ccEmail:
        return context.strings.email_subtitle;
      case NotificationPermissionType.ccDigital:
        return context.strings.digital_media_subtitle;
      case NotificationPermissionType.ccSms:
        return context.strings.sms_subtitle;
      case NotificationPermissionType.b2bDigital:
      case NotificationPermissionType.companyNotifications:
        return context.strings.club_newsletter_subtitle;
      case NotificationPermissionType.appNotifications:
        return context.strings.push_subtitle;
      case NotificationPermissionType.companyEmail:
      case NotificationPermissionType.stayEmails:
      case NotificationPermissionType.similarProducts:
        return '';
    }
  }
}

@JsonSerializable()
class NotificationPermission {
  final String code;
  final String displayName;
  final NotificationPermissionType? notificationPermissionDescription;
  final bool given;

  const NotificationPermission({
    required this.code,
    required this.displayName,
    this.notificationPermissionDescription,
    required this.given,
  });

  factory NotificationPermission.fromJson(Json json) => _$NotificationPermissionFromJson(json);

  Json toJson() => _$NotificationPermissionToJson(this);

  NotificationPermission copyWith({
    bool? given,
    NotificationPermissionType? notificationPermissionDescription,
  }) => NotificationPermission(
    code: code,
    displayName: displayName,
    notificationPermissionDescription: notificationPermissionDescription,
    given: given ?? this.given,
  );

  @override
  String toString() {
    return 'NotificationPermission{code: $code, displayName: $displayName, given: $given}';
  }
}