import { IAction } from '@src/model/Projects'
import { IFriends, IMyGroup, IPaymentType } from '@src/model/UserStore'
import {
  IDepartment, IProducer, IShareWithUs, IStorehouse,
} from '@src/model/Products'

import { IUserFields, IUserProfile } from '@src/model/UserStore'

export interface IPost {
  title: string
}

export interface ICheckUser {
  verified_email?: boolean
  teleg_id?: number
  profile?: IUserProfile
}


export interface INotData {
  num_reg?: number
  online_today?: number
  num_passeggeri?: number
  num_imbarcati?: number
  email_non_verif?: number
  num_teleg_attivo?: number
  num_autorizzare?: number
  num_autorizzati?: number
  num_teleg_pending?: number
  num_part_zoom?: number
  num_part_accepted?: number
  num_modalita_pagamento?: number
  arr_nations?: string
  lastsreg?: IUserFields[]
  checkuser?: ICheckUser | any
  numreg_untilday?: number
  reg_daily?: string
  imbarcati_daily?: string
  imbarcati_weekly?: string
  reg_weekly?: string
}


export interface IConnData {
  downloading_server: number
  downloading_indexeddb: number
  uploading_server: number
  uploading_indexeddb: number
}

export interface ICfgServer {
  chiave: string
  idapp: string
  userId: string
  valore: string
}

export interface ICfgData {
  _id?: string
  lang?: string
  token?: string
  userId?: string
}

export interface ITemplEmail {
  _id?: string
  subject?: string
  content?: string
  options?: ISettings[]
}

export interface ISettings {
  _id?: string
  idapp?: string
  key?: string
  type?: number
  value_str?: string
  value_date?: Date,
  value_num?: number
  value_bool?: boolean
  serv?: boolean
  crypted?: boolean
}

export interface ITeachUname {
  username?: string
}

export interface IInternalPage {
  path?: string
}

export interface IResp {
  _id?: string
  username?: string
  name?: string
  surname?: string
}

export interface IMyBot {
  _id?: string
  page?: number
  index?: number
  riga?: number
  active?: boolean
  main?: boolean
  label?: string
  type?: number
  value?: string
  visibility?: number
  date_updated?: Date
}

export interface IMyElem {
  _id?: string
  type?: number
  title?: string
  container?: string
  container2?: string
  container3?: string
  number?: number
  imgback?: string
  ratio?: string
  containerHtml?: string
  size?: string
  order?: string
  width?: string
  height?: string
  heightimg?: string
  widthimg?: string
  link?: string
  onlyif_logged?: boolean
  active?: boolean
  class?: string
  styleadd?: string
  list?: IImgGallery[]

}

export interface IMyPage {
  _id?: string
  author_username?: string
  lang?: string
  title?: string
  subtitle?: string
  icon?: string
  iconsize?: string
  order?: number
  path?: string
  keywords?: string
  description?: string
  img1?: string
  content?: string
  video1?: string
  ratio1?: string
  img2?: string
  content2?: string
  video2?: string
  ratio2?: string
  img3?: string
  content3?: string
  video3?: string
  ratio3?: string
  content4?: string
  active?: boolean
  inmenu?: boolean
  color?: string
  onlyif_logged?: boolean
  only_residenti?: boolean
  only_consiglio?: boolean
  submenu?: boolean
  l_par?: number,
  l_child?: number,
  infooter?: boolean
  internalpage?: boolean
  extraclass?: string
}

export interface IOption {
  options: number
}

export interface ISites {
  _id?: string
  attiva?: boolean
  idapp?: string
  name?: string
  adminemail?: string
  manageremail?: string
  replyTo?: string
  host?: string
  host_test?: string
  portapp?: string
  dir?: string
  email_from?: string
  email_pwd?: string
  telegram_key?: string
  telegram_bot_name?: string
  telegram_key_test?: string
  telegram_bot_name_test?: string
  telegram_support_chat?: string
  pathreg_add?: string
  confsite: IOption
}

export interface INewsToSent {
  _id: string
  idapp?: string
  label?: string
  templemail_str?: string
  numemail_tot?: number
  numemail_sent?: number
  datetoSent?: Date
  datestartJob?: Date
  datefinishJob?: Date
  lastemailsent_Job?: Date
  starting_job?: boolean
  finish_job?: boolean
  error_job?: string
}

export interface ICalZoom {
  lang?: string
  title?: string
  typeconf?: string
  date_start?: string
  date_end?: Date
  id_conf_zoom?: number
  note?: string
}

export interface IGroup {
  _id?: any
  descr?: string
}

export interface IMailinglist {
  name?: string
  surname?: string
  email: string
  lastid_newstosent?: string
}

export interface IDiscipline {
  typol_code?: string
  order?: number
  label?: string
  description?: string
  linkpage?: string
  color?: string
  icon?: string
  img_small?: string
  showinhome?: boolean
  showinnewsletter?: boolean
  img?: string
  teachers?: ITeachUname[]
}

export interface ITestp1 {
  contatore: number
  mioarray: ICfgServer[]
}

export type StateConnection = 'online' | 'offline'

export interface IConfig {
  _id: string,
  key?: string,
  value: string
}

export interface IMetaTags {
  title?: string
  keywords?: string
  description?: string
}

export interface ICircuitState {
  listcircuits: ICircuit[]
}

export interface IGlobalState {
  finishLoading: boolean
  conta: number
  wasAlreadySubOnDb: boolean
  wasAlreadySubscribed: boolean
  isLoginPage: boolean
  layoutNeeded: boolean
  mobileMode: boolean
  menuCollapse: boolean
  leftDrawerOpen: boolean
  rightDrawerOpen: boolean
  rightNotifOpen: boolean
  rightCoinsOpen: boolean
  rightCartOpen: boolean
  category: string
  stateConnection: string
  serverError: boolean
  serverMsgError: any
  networkDataReceived: boolean
  clickcmd?: string
  cfgServer: ICfgServer[]
  testp1: ITestp1
  connData: IConnData
  posts: IPost[]
  menulinks: {}
  listatodo: IMenuList[]
  arrConfig: IConfig[]
  lastaction: IAction
  serv_settings: ISettings[],
  settings: ISettings[],
  disciplines: IDiscipline[],
  paymenttypes: IPaymentType[],
  newstosent: INewsToSent[],
  gallery: IGallery[],
  mypage: IMyPage[],
  myelems: IMyElem[],
  templemail: ITemplEmail[],
  opzemail: ISettings[],
  mailinglist: IMailinglist[],
  calzoom: ICalZoom[],
  producers: IProducer[],
  storehouses: IStorehouse[],
  departments: IDepartment[],
  sharewithus: IShareWithUs[],
  groups: IGroup[],
  resps: IResp[],
  workers: IResp[],
  autoplaydisc: number
  TIMER: any
  TIMEOUT: any
  CUT: any
  TIMER_STATE: number
  URL_RITORNA: string
  URL_RESTORE: string
  serverHost?: string
  levels: ILevel[],
  adtypes: IAdType[],
  adtypegoods: IAdType[],
  skills: ISkill[],
  goods: IGood[],
  // subSkills: ISubSkill[],
  statusSkills: IStatusSkill[],
  sectors: ISector[],
  sectorgoods: ISectorGood[],
  catgrps: ICatGrp[],
  provinces: IProvince[],
  datastat?: INotData
  site?: ISites,
  mygroups: IMyGroup[],
}

export interface IMenuList {
  nametranslate: string
  description?: string
  idelem?: string
  icon?: string
  name?: string
  level_parent?: number
  level_child?: number
  urlroute?: string
  routes2?: IMenuList[]
}

export interface IPathFile {
  path: string
  file: string
}

export interface IListRoutes {
  active?: boolean
  order: number
  path: string
  name: string
  subtitle?: string
  lang?: string
  materialIcon?: string
  iconsize?: string
  component?: any
  children?: any
  reqauth?: boolean
  isseparator?: boolean
  inmenu?: boolean
  solotitle?: boolean
  infooter?: boolean
  submenu?: boolean
  noroute?: boolean
  onlyAdmin?: boolean
  onlyif_logged?: boolean
  onlyManager?: boolean
  onlySocioResidente?: boolean
  onlyConsiglio?: boolean
  onlyNotSoci?: boolean
  onlyDepartment?: boolean
  onlyFacilitatore?: boolean
  color?: string
  onlyEditor?: boolean
  extraclass?: string
  meta?: any
  idelem?: string
  urlroute?: string
  img?: string
  // ------------------------
  faIcon?: string
  text?: string
  routes2?: IListRoutes[]
  level_parent?: number
  level_child?: number
  separator?: boolean
}

export interface IOperators {
  username: string
  name: string
  surname: string
  email?: string
  qualification?: string
  disciplines?: string
  certifications?: string
  img?: string
  cell?: string
  usertelegram?: string
  paginaweb?: string
  paginafb?: string
  intro?: string
  info?: string
  vario?: string
  tab?: string
}

export interface IPreloadImages {
  imgname: string
  alt: string
  mobile: boolean
}

export interface ILang {
  label: string
  icon: string
  value: string
  image: string
  short: string
}

export interface IAllLang {
  es?: string
  enUs?: string
  fr?: string
  de?: string
  it?: string
}

export interface ITimeLineEntry {
  date: string
  title: string
  description: IAllLang
  description2?: IAllLang
  description3?: IAllLang
  icon: string
  image: string
  image2?: string
  image3?: string
  image4?: string
  video?: string
  side: string
  link_url?: string
  link_url_lang?: IAllLang
  link_text?: IAllLang
  ingallery?: boolean
}

export interface ITimeLineMain {
  titlemain: IAllLang | any
  body: ITimeLineEntry[]
}

export interface IImgGallery {
  _id?: string
  imagefile: string
  // order?: number
  alt?: string
  description?: string
}

export interface IGallery {
  _id?: string
  author_username?: string
  title?: string
  directory?: string
  list?: IImgGallery[]
}

export interface IColl {
  title: IAllLang | any
  date?: string
  subtitle?: IAllLang | any
  img: string
  img2?: string
  linkagg?: string
  linkagg_type?: number
  width?: number
  height?: number
  ingallery?: boolean
  inexibitions?: boolean
}

export interface ICollaborations {
  withwhom_title: IAllLang | any
  list: IColl[]
}

export interface IParamDialog {
  param1?: any
  param2?: any
  param3?: any
}

export interface IFunctionality {
  PWA?: boolean
  ENABLE_REGISTRATION?: boolean
  ENABLE_REG_BY_BOT?: boolean
  ENABLE_REG_NEED_TELEGRAM?: boolean
  SHOW_REG_BUTTON?: boolean
  SHOW_PROFILE?: boolean
  SHOW_USER_MENU?: boolean
  SHOW_IF_IS_SERVER_CONNECTION?: boolean
  ENABLE_TODOS_LOADING?: boolean
  ENABLE_PROJECTS_LOADING?: boolean
  ENABLE_ECOMMERCE?: boolean
  SHOW_NEWSLETTER?: boolean
  SHOW_ONLY_POLICY?: boolean
  SHOW_MESSAGES?: boolean
  SHOW_NOTIF?: boolean
  SHOW_COINS?: boolean
  BOOKING_EVENTS?: boolean
  ENABLE_REG_AYNI?: boolean
  ENABLE_REG_CNM?: boolean
  ENABLE_REG_ISP?: boolean
  SHOW_NAMESURNAME?: boolean
  ENABLE_GROUPS?: boolean
  ENABLE_CIRCUITS?: boolean
  SHOW_COMPETENZE?: boolean
  ENABLE_VIEW_GROUPS?: boolean
  ENABLE_VIEW_USERS?: boolean
  ENABLE_VIEW_PROFILE?: boolean
  ENABLE_VIEW_BOOKINGS?: boolean
}

export interface IParLookup {
  lk_tab?: string,
  af_objId_tab?: string,
  lk_LF?: string,
  lk_FF?: string,
  lk_as?: string,
  lk_proj?: string,
}

export interface IParamsPickup {
  table: string
  search: string
  filter: string
}
export interface IParamsQuery {
  table: string
  startRow: number
  endRow: number
  filter: string
  filterand: string
  sortBy: string
  descending: number
  userId: string
  codeId?: string
  filtersearch: string
  filtersearch2: string
  filtercustom: string
  filter_gte: string
  lookup1?: IParLookup
  lookup2?: IParLookup
  lookup3?: IParLookup
  lookup4?: IParLookup
  options?: number
  extrapar?: string
}

export interface ISpecialField {
  findsubkey?: any
  paramtosetsubkey?: any
  paramdef?: any
  defaultnewrec?: object
}

export interface IColGridTable {
  name: string
  subfield?: string
  required?: boolean
  label?: string
  label_trans?: string
  visibleif?: number
  visib_field?: string
  visib_value?: any
  align?: string
  field?: string
  sortable?: boolean
  visulabel?: boolean
  disable?: boolean
  titlepopupedit?: string
  visible?: boolean
  icon?: string
  action?: any
  askaction?: string
  foredit?: boolean
  isInModif?: boolean
  fieldtype?: number
  fieldtype_real?: number
  field_outtype?: number
  noshowlabel?: boolean
  tipovisu?: number
  link?: string
  jointable?: string
  addall?: boolean
  addnone?: boolean
  filter?: any
  resultjoin?: string[]
  tablesel?: string
  notsave?: boolean
  isadvanced_field?: boolean
  showWhen?: number
  maxlength?: number
  minlength?: number
  allowchar?: number
  filter_table?: string
  filter_field?: string
  remote_table?: string
  remote_key?: string
  remote_field?: string
  field_extra1?: string
  subfield_extra1?: string
  allowNewValue?: boolean
  showpicprofile_ifnotset?: boolean
  extrafield?: string
}

export interface ITableRec {
  label: string
  value: string
  columns: IColGridTable[]
  colkey: string
  collabel: string
  colicon?: string
  onlyAdmin?: boolean
  noshow: boolean
  remote?: boolean
}

export interface ISearchList {
  label: string
  table: string
  key: string
  arrvalue: any[]
  value: any
  type: number
  filter: any
  param1?: any
  useinput: boolean
  notinsearch?: boolean
  addall?: boolean
  showcount?: boolean
  tablesel?: string
  icon?: string
  filteradv?: boolean
  filter_extra?: object
}

export interface IFilter {
  label: string
  value: string
  hide?: boolean
  default?: boolean
}

export interface IDataPass {
  id: string
  table: string
  fieldsvalue: any
}

export interface IMsgGlobParam {
  typemsg: number,
  title?: string,
  content?: string,
  openUrl?: string,
  openUrl2?: string,
  tag?: string,
  actions?: any[],
  cmd?: number
  usernameOrig?: string
  usernameDest?: string
  groupnameDest?: string
  text?: string
  typesend: number
  sendreally?: boolean
}

export interface IDataToSet {
  id?: string | null
  username?: string
  table?: string
  fieldsvalue?: any
  unset?: any,
  notifBot?: any | null
  tipomsg?: number
  invitante_username?: string
  ind_order?: any
  num_tess?: number
  data?: any
  myfunc?: any
  inviaemail?: any
}

export interface INewsState {
  lastnewstosent: INewsToSent | null
  nextnewstosent: INewsToSent | null
  totemail: number
  totsubscribed: number
  totunsubscribed: number
  totsentlastid: number
}

export const DefaultNewsState: INewsState = {
  lastnewstosent: null,
  nextnewstosent: null,
  totemail: 0,
  totsubscribed: 0,
  totunsubscribed: 0,
  totsentlastid: 0,
}

export interface IPagination {
  sortBy: string,
  descending: boolean
  rowsNumber: number
  page: number,
  rowsPerPage: number // specifying this determines pagination is server-side
}

export interface ISkill {
  _id: number
  descr: string
  idSector: number[]
  icon?: string
  img?: string
}
export interface IGood {
  _id: number
  descr: string
  idSectorGood: number[]
  icon?: string
  img?: string
}

/*
export interface ISubSkill {
  _id: number
  descr: string
  idSkill: number
  icon?: string
  img?: string
}

 */


export interface IStatusSkill {
  _id: number
  descr: string
  color: string
  icon: string
  theme: string
}


export interface ISector {
  _id: number
  descr: string
  idSector?: number
  icon?: string
  img?: string
  color: string
  theme: string
}

export interface ISectorGood {
  _id: number
  descr: string
  idSectorGood?: number
  icon?: string
  img?: string
  color: string
  theme: string
}

export interface ICatGrp {
  _id: number
  descr: string
  idCatGrp?: number
  icon?: string
  img?: string
  color: string
  theme: string
}

export interface ILevel {
  _id: number
  descr: string
  color: string
  theme: string
  years_of_exp: number
}

export interface IAdType {
  _id: number
  descr: string
}

export interface ICity {
  _id: number
  istat: string
  comune: string
  prov: string
}

export interface IProvince {
  _id: number
  prov: string
  reg: string
  descr: string
  link_grp: string
}

export interface IMySkill extends IMyMain {
  _id: number
  idSector: number
  idSkill: number
  // idSubSkill: number[]
  idStatusSkill: number[]
  idContribType: string[]
  idCity: number[]
  photos: IGallery[]
  NumLevel: number
  adType: number
  note: string
  // **ADDFIELD_MYSKILL
  website: string
  descr: string
  date_created?: Date,
  date_updated?: Date,

  username?: string
}

export interface IMyMain {
  pub_to_share?: number
}

export interface IMyGoods extends IMyMain {
  _id: number
  idSector: number
  idSkill: number
  idShipping: number[]
  idStatusSkill: number[]
  idContribType: string[]
  otherfilters: number[]
  idCity: number[]
  photos: IGallery[]
  NumLevel: number
  adType: number
  note: string
  // **ADDFIELD_MYSKILL
  website: string
  descr: string
  date_created?: Date,
  date_updated?: Date,
}

export interface IMyBacheca extends IMyMain {
  _id: number
  idSector: number
  idSkill: number
  // idSubSkill: number[]
  idStatusSkill: number[]
  idContribType: string[]
  dateTimeStart: Date
  dateTimeEnd: Date
  idCity: number[]
  photos: IGallery[]
  NumLevel: number
  adType: number
  note: string
  // **ADDFIELD_MYBACHECAS
  website: string
  descr: string
  date_created?: Date,
  date_updated?: Date,
}

export interface IAccomodation {
  type: number  // Letto matrimoniale / letto singolo / divano-letto / almaca / a terra sul tappeto (per sacco a pelo)
  location: number  // in camera privata / in camera condivisa / in soggiorno / in camper / in tenda / in giardino / all'aperto
  num: number
}

export interface IMyHosp extends IMyMain {
  _id: number
  visibile: boolean
  typeHosp: number
  numMaxPeopleHosp: number
  accomodation: IAccomodation[]
  photos: IGallery[]
  preferences: number[]
  idContribType: string[]
  idCity: number[]
  descr: string
  note: string
  website: string
  date_created?: Date,
  date_updated?: Date,
}

export interface ICircuitList {
  _id: string,
  inscription_date?: Date
}

export interface IMyCircuit {
  _id: string
  circuitname: string
  date: Date
}

export interface ISendCoin {
  circuitname: string
  qty: number
  dest: string
  causal: string
  symbol: string
}

export interface ICircuit {
  _id: string
  groupnameId: string
  name: string
  path: string
  subname: string
  longdescr: string
  systemUserDescr: string
  systemUserId: string
  totCircolante: number
  totTransato: number
  // nome_valuta: string
  symbol: string
  color: string
  abbrev: string
  compara_valuta?: number
  compara_euro?: number
  valuta_per_euro?: number
  fido_scoperto_default?: number
  qta_max_default?: number
  data_costituz?: Date
  deperimento: boolean
  transactionsEnabled: boolean
  status: number
  freq_deper?: string
  minuto_deper?: string
  ora_deper?: string
  giorno_deper?: string
  mese_deper?: string
  ultimo_deper?: Date
  durata_deper?: number
  photos?: IImgGallery[]
  date_created?: Date
  date_updated?: Date
  admins?: IFriends[]
  createdBy?: string
  regulation?: string
  numMembers?: number
  // --- Mem:
  movements: IMovement[]
}

export interface IMovement {
  _id: string
  transactionDate: Date
  accountFromId: string
  accountToId: string
  amount: number
  causal: string
  residual: number
  expiringDate: Date
}

export interface IMovVisu {
  transactionDate: Date
  userfrom: IUserFields
  userto: IUserFields
  circuitfrom: ICircuit
  circuitto: ICircuit
  amount: number
  causal: string
  residual: number
  expiringDate: Date
}

export interface IAccount {
  username: string
  circuitId: string
  circuit: ICircuit[]
  name: string
  deperibile: boolean
  fidoConcesso: number
  qta_maxConcessa: number
  importo_iniziale?: number
  saldo: number
  totTransato: number
  regulation_ok: boolean
}
