import { Locale } from ".";

export type ReminderTypes = "textMessage" | "email";

export type NotificationSettings = Record<ReminderTypes, boolean>;

/**
 * No enum support in d.ts files,
 * Use NotificationKeysEnum for mapped enum value
 * corresponds with:
 * - acceptedByContact = 0,
 * - assignedByContact= 1,
 * - completedByContact = 2,
 * - invitedByContact = 3,
 * - cancelledByContact = 4,
 * - cancelledByCustomer = 5,
 * - dateCreatedByContact = 6,
 * - dateCreatedByCustomer =7,
 * - dateChangedByContact = 8,
 * - dateChangedByCustomer = 9,
 * - possibilitiesCreatedByCustomer = 10,
 * - possibilitiesChangedByCustomer = 11,
 * - possibilitiesRequestedByContact = 12,
 */
export type NotificationKeys = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;

export type Notifications = {
  [k in NotificationKeys]: NotificationSettings;
};

export interface ReminderInterval {
  time: number;
}

export type ReminderSettings = Record<ReminderTypes, ReminderInterval[]>;

export interface DefaultEnterpriseSettings {
  allow_office_365_login: boolean;
  allowed_sync_providers: string[];
  appointment_block_suggestions: string;
  appointment_completion_max_future_days: number;
  appointment_contact_select: string;
  appointment_max_suggestions: number;
  appointment_min_preparation_time: number;
  appointment_min_suggestions: number;
  appointment_travel_buffer_time: number;
  availability_max_future_days_to_sync: number;
  contact_notifications: Notifications;
  default_language: Locale;
  enterprise_id: number;
  first_time_customer_fields: FirstTimeCustomerFields;
  id: string;
  internal_customer_fields: InternalCustomerFields;
  notifications_window?: unknown;
  notifications: Notifications;
  reminders: ReminderSettings;
  returning_customer_fields: ReturningCustomerFields;
  sender_email_addresses?: null | {
    [locale: string]: string | undefined | null;
  };
  show_qr_code_in_customer_email: boolean;
  video_provider_test_url: string;
  web_app_is_reassign_search_enabled: boolean;
}

export enum WebAppCustomerBehaviour {
  ENABLED = "enabled",
  DISABLED = "disabled",
}

export interface EnterpriseTeamSettings {
  allow_team_appointments: boolean;
  allow_team_insights: boolean;
  allow_team_team: boolean;
  allow_team_office: boolean;
  allow_team_scheduling_assignments: boolean;
  allow_team_scheduling_planning_rules: boolean;
  allow_team_scheduling_coverage_regions: boolean;
  allow_team_team_unlink: boolean;
  allow_team_team_profile: boolean;
  allow_team_team_availability: boolean;
  allow_team_team_expertise: boolean;
  allow_team_team_calendar_sync: boolean;
}

export interface EnterprisePersonalSettings {
  allow_personal_account: boolean;
  allow_personal_availability: boolean;
  allow_personal_calendar_sync: boolean;
  allow_personal_application_settings: boolean;
}

export interface EnterpriseAppointmentsSettings {
  allow_personal_appointments: boolean;
}

export interface EnterpriseCustomerSettings {
  appointment_create_allow_change_customer: boolean;
  appointment_create_allow_create_customer: boolean;
  appointment_create_allow_customer_instigator: boolean;
  appointment_create_allow_invite_customer: boolean;
  web_app_customers_behaviour: WebAppCustomerBehaviour;
}

export interface EnterpriseSubjectSettings {
  appointment_create_allow_set_subject: boolean;
  default_subject_id?: string | null;
}

export interface EnterpriseAvailabilitySettings {
  appointment_default_duration: number;
  appointment_earliest_possible: number;
  appointment_latest_possible: number;
  time_slot_granularity: number;
}

export interface EnterprisePluginSettings {
  redirect_url: string;
  localized_redirect_urls: [] | { [lang: string]: string };
  terms_conditions_url: string;
}

export interface EnterpriseUserCommunicationSettings {
  send_notification_emails?: boolean;
  send_notification_sms?: boolean;
}

export type EnterpriseSettings = DefaultEnterpriseSettings &
  EnterpriseCustomerSettings &
  EnterprisePersonalSettings &
  EnterpriseTeamSettings &
  EnterpriseAppointmentsSettings &
  EnterpriseSubjectSettings &
  EnterpriseAvailabilitySettings &
  EnterprisePluginSettings &
  EnterpriseUserCommunicationSettings;

export interface CustomerFieldSetting {
  ask: boolean;
  required: boolean;
  order: number;
}

export interface FirstTimeCustomerFields {
  // address: CustomerFieldSetting;
  cell_phone_number: CustomerFieldSetting;
  company: CustomerFieldSetting;
  // credit_card_number: CustomerFieldSetting;
  customer_number: CustomerFieldSetting;
  // debit_card_number: CustomerFieldSetting;
  // dob: CustomerFieldSetting;
  /** Mandatory */
  email: CustomerFieldSetting;
  // home_phone_number: CustomerFieldSetting;
  is_existing: CustomerFieldSetting;
  /** Mandatory */
  name: CustomerFieldSetting;
  // title: CustomerFieldSetting;
  location: CustomerFieldSetting;
}

export interface ReturningCustomerFields extends FirstTimeCustomerFields {
  /** Mandatory*/
  external_customer_id: CustomerFieldSetting;
}

interface InternalCustomerFieldSetting {
  ask: boolean;
  required: boolean;
  order: number;
  private: boolean;
}

export interface InternalCustomerFields {
  customer_number: InternalCustomerFieldSetting;
  external_id: InternalCustomerFieldSetting;
  first_name: InternalCustomerFieldSetting;
  last_name: InternalCustomerFieldSetting;
  email: InternalCustomerFieldSetting;
  phone_number: InternalCustomerFieldSetting;
  language: InternalCustomerFieldSetting;
}
