import { Country, Language, SearchFilter } from "../../core/commonTypes"
import {ItemType} from "../ECommerce/typings"

export enum NavigationTypes {
  App = "app",
  Identify = "identify",
  Media = "media",
  NudgeResponse = 'nudge_response',
  Page = "page",
  Rate = "rate",
  Search = "search",
  ModuleSelection = "module_selection",
}

export enum CoreCatalogType {
  User = "user",
  Site = "site",
  Media = "media",
  Other = "other",
}

export enum ContentBlock {
  Core = "core",
  ELearning = "e-learning",
  ECommerce = "e-commerce",
  Payment = "payment",
  Loyalty = "loyalty",
  PatientMgmt = "patient_mgmt",
  CallCenter = "call_center",
  EmergencyMgmt = "emergency_mgmt",
}

export enum ModuleType {
  Core = "core",
  ECommerce = "e_commerce",
  ELearning = "e_learning",
  Screening = "screening",
  Assessment = "assessment",
  Enrolment = "enrolment",

  MedicalReview = "medical_review",
  MyPatients = "my_patients",
  Appointments = "appointments",
  Prescription = "prescription",
  LifestyleMgmt = "lifestyle_mgmt",
  PsychologicalMgmt = "psychological_mgmt",
  CounselingMgmt = "counseling_mgmt",
  Investigation = "investigation",
  TreatmentPlan = "treatment_plan",
  Transfers = "transfers",

  HCWMgmt = "hcw_mgmt",
  Break = "break",
  CallerHistory = "caller_history",
  AttendCall = "attend_call",
  Single = "single",
  Dashboard = "dashboard",
  Map = "map",

  Other = "other"
}

export type SearchModuleType = ModuleType;



export enum AppAction {
  Background = "background",
  Close = "close",
  Open = "open",
  Resume = "resume"
}


export enum IdentityAction {
  Login = "login",
  Logout = "logout",
  Register = "register",
  Blocked = "blocked",
  UnBlocked = "unblocked"
}

export enum MediaAction {
  View = "view",
  Impression = "impression",
  Play = "play",
  Pause = "pause",
  Seek = "seek",
  Finish = "finish"
}

export enum MembersCount {
  None = "none",
  One = "1",
  Two = "2",
  Three = "3",
  Four = "4",
  FiveOrMore = "5_or_more",
  Undisclosed = "undisclosed"
}

export enum UserGender {
  Male = "male",
  Female = "female",
  Other = "other",
  UnDisclosed = "undisclosed"
}

export enum SearchItemType {
  PatientRecord = "patient_record",
  LifestylePlanItem = "lifestyle_plan_item",
  TreatmentPlanItem = "treatment_plan_item",
  PsychologicalPlanItem = "psychological_plan_item",
  CounselingPlanItem = "counseling_plan_item",
  InvestigationTestItem = "investigation_test_item",

  Blood = "blood",
  Oxygen = "oxygen",
  Drug = "drug",
  Grocery = "grocery",
  Facility = "facility",
  MedicalEquipment = "medical_equipment",
  Subscription = "subscription",
  Electronics = "electronics",
  Clothing = "clothing",
  Book = "book",

  ItemVerification = "item_verification",
  ItemReport = "item_report",
  Reward = "reward",
  Survey = "survey",

  Incident = "incident",
  Address = "address",
  Ambulance = "ambulance",
  OtherVehicle = "other_vehicle",
  Contact = "contact",
  Call = "call",
  Email = "email",
  SMS = "sms",

  Other = "other"
}

export enum MaritalStatus {
  Single = "single",
  Married = "married",
  Widowed = "widowed",
  Divorced = "divorced",
  Separated = "separated",
  Other = "other",
  UnDisclosed = "undisclosed"
}

export interface AppProperties {
  action: AppAction,
  start_time: number
}

export interface IdentifyProperties {
  action: IdentityAction,
  referral_code?: string
  blocked?: IdentifyBlockObject,
}

export interface IdentifyBlockObject{
  reason: string,
  remarks?: string
}

export interface UserInfo extends IdentifyProperties {
  user_props: UserCatalog
}

export type ImageProperties = {
  /**
 * The block or module where the media is embedded. For example,
 * 'e-learning' if the media is included as an activity
 * of the course
 *
 */
  contentBlock?: ContentBlock,
  type: MediaType,
  id: string,
  action: MediaAction,
  time: number,
  meta?: any
}

export enum MediaType {
  Audio = "audio",
  Video = "video",
  Image = "image"
}

export type AudioVideoProperties = {
  /**
 * The block or module where the media is embedded. For example,
 * 'e-learning' if the video or audio is included as an activity
 * of the course
 *
 */
  contentBlock?: ContentBlock,
  type: MediaType,
  id: string,
  action: MediaAction,
  time: number
  meta?: any
}

export type MediaProperties = ImageProperties | AudioVideoProperties

export type MediaCatalog = {
  id: string //(type)_(id_source) == video_testMediaId
  type: MediaType  // <video, audio>
  name?: string
  length: string, // video length in milliseconds //uint32
  description?: string,
  resolution?: string,
  language?: Language
}

export interface PageProperties {
  path: string,
  title?: string,
  duration?: number,
  render_time: number,
  meta?: any
}

export enum NudgeAction {
  Shown = "shown",
  Error = "error",
  Block = "block",
  Discard = "discard",
  Open = "open",
  Expired = "expired",
}

export enum NudgeResponseType {
  Push = 'push_notification',
  InApp = 'in_app_message'
}

export interface NudgeResponseProperties {
  "ref": string,
  "response": string,
  "time":  string,
  "details"?: string
}

export enum SiteCatalogType {
  Pharmacy = 'pharmacy',
  Clinic = 'clinic',
  Community = 'community'
}

/**
 * This interface represents the information related to
 * a search
 */
export interface SearchProperties {

  /**
   * Free text introduced by the user to search
   */
  query: string,
  module: ModuleType,
  /**
   * Current list of items IDs obtained for this search and page.
   * If the user have pressed in a new page number, of scroll down
   * and the web automatically retrieved new item, include here only
   * the new ones
   */
  results_list: Array<ItemMinObject> // list of result ids
  /**
   * If the search engine allow to select specific value to search
   * in a selectable list, include here an object whose keys are the
   * attributes to search, and the values the actual values that must
   * match
   */
  filter?: SearchFilter
  /**
   * If the search results are shown paginated, or with infinite scroll,
   * this field represent the number of page/subset the current result_ids
   * belongs to
   */
  page: number,
  /**
   * Any other additional information to be available in the logs
   */
  meta?: any
}


export interface ItemMinObject {
  id: string,
  type: SearchItemType | ItemType
}

export enum EducationalLevel {
  Primary = "primary",
  LowerSecondary = "lower_secondary",
  UpperSecondary = "upper_secondary",
  NonTertiary = "non_tertiary",
  Tertiary = "tertiary",
  Bachelors = "bachelors",
  Masters = "masters",
  Doctorate = "doctorate"
}

export enum UserAccountType {
  Basic = "basic",
  Classic = "classic",
  Advanced = "advanced",
  Other = "other"
}

export interface UserCatalog {
  id: string
  name?: string,
  organization_id?: string,
  organization_name?: string,
  experience?: string,
  region_state?: string,
  city?: string,
  workplace?: string,
  profession?: string,
  zipcode?: string,

  /**
   * ISO 8601 string (ie.: +0200)
   * Generated automatically by the SDK
   */
  timezone?: string,
  /**
   * country which the user is, represented as
   * two characters in ISO 3166
   */
  country?: Country,
  /**
   * iSO 639-1
   */
  language?: Language,
  education_level?: EducationalLevel,
  account_type?: UserAccountType,
  birth_year?: number,
  gender?: UserGender,
  marital_status?: MaritalStatus,
  family_members?: MembersCount,
  children_under_five?: MembersCount,
  referral_code?: string
}

export interface SiteCatalog {
  id : string,
  name: string,
  type: SiteCatalogType,
  country?: Country,
  region_state?: string,
  city?: string,
  street_address?: string,
  zipcode?: string,
  level?: string,
  is_active?: boolean,
  latitude?: number,
  longitude?: number,
  culture?: string,
  parent_id?: string
  service_list?: Array<string>,
  sub_type?: string,
  priority?: string,
  is_private?: boolean,
  district?: string,
  sub_district?: string,
  landmark?: string,
  attributes?: SiteAttributes,
}

export interface SiteAttributes {
  bed_number?: number,
  insurance_plan_lst?: Array<string>,
}

export enum RateType {
  App = "app",
  Exam = "exam",
  Question = "question",
  Module = "module",
  Process = "process",
  Form = "form",
  Section = "section",
  Media = "media",
  Order = "order",
  Item = "item",
  HCW = "hcw",
  HcwSite = "hcw_site",
  Facility = "facility",
  Assessment = "assessment",
  Customer = "customer",
  Other = "other"
}

export interface RateProperties {
  rate_value: number,
  type: RateType,
  subject_id: string,
  meta?: any
}

export interface ModuleSelectionProperties {
  type: ModuleType,
  meta?: any
}
