import { CreatorSimple, User } from '.'

export {}

export type UrlAccess = {
  creatorDependend: boolean
  creatorFeatures: string[]

  userDependend: boolean
  userFeatures: string[]
  adminOnly: boolean
}

export const pageToUrlAccessMapper: Record<string, UrlAccess> = {
  overview: {
    creatorDependend: true,
    creatorFeatures: ['stats'],
    userDependend: true,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  tasks: {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: ['Tasks'],
    adminOnly: false,
  },
  projects: {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: ['Projects'],
    adminOnly: false,
  },
  chat: {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: ['Chat'],
    adminOnly: false,
  },
  creators: {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  'creators-id': {
    creatorDependend: true,
    creatorFeatures: ['stats'],
    userDependend: false,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  'creators-id-tiktok': {
    creatorDependend: true,
    creatorFeatures: ['tiktok'],
    userDependend: true,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  'creators-id-settings': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  'creators-id-chatter-tracking': {
    creatorDependend: true,
    creatorFeatures: ['chat_tracking'],
    userDependend: true,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  'creators-id-chatter-tracking-chatter': {
    creatorDependend: true,
    creatorFeatures: ['chat_tracking'],
    userDependend: true,
    userFeatures: ['Creators'],
    adminOnly: false,
  },
  'creators-id-upgrade': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: false,
    userFeatures: [],
    adminOnly: true,
  },
  'creator-id-activate': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: false,
    userFeatures: [],
    adminOnly: true,
  },
  'creator-id-license': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: false,
    userFeatures: [],
    adminOnly: true,
  },
  'add-creator-id': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: false,
    userFeatures: [],
    adminOnly: true,
  },
  'account-licenses': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: false,
    userFeatures: [],
    adminOnly: true,
  },
  'account-settings': {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: [],
    adminOnly: false,
  },
  team: {
    creatorDependend: false,
    creatorFeatures: [],
    userDependend: true,
    userFeatures: ['TeamManagement'],
    adminOnly: true,
  },
}

/**
 *
 * @param user
 * @param creators
 * @param route this.$route.name
 * @returns
 */
export const hasAccessToRoute = (
  user: User,
  creators: CreatorSimple[],
  route: string,
  _path: string,
) => {
  // return true if pageToUrlAccessMapper doesn't have a key for the route
  if (!Object.keys(pageToUrlAccessMapper).includes(route)) {
    return true
  }

  const urlAccess = pageToUrlAccessMapper[route]

  if (!urlAccess) {
    return true
  }

  if (
    urlAccess.adminOnly &&
    !(user.role === 'ADMIN' || user.role === 'OWNER')
  ) {
    return false
  }

  if (
    route === 'overview' &&
    user.showOverview &&
    user.availableFeatures.includes('Creators')
  ) {
    return true
  }

  if (
    urlAccess.userDependend &&
    !urlAccess.userFeatures.every(f => user.availableFeatures?.includes(f))
  ) {
    return false
  }

  if (urlAccess.creatorDependend) {
    for (const creator of creators) {
      if (creator.features?.find(f => urlAccess.creatorFeatures.includes(f))) {
        return true
      }
    }
    return false
  }

  return true
}

declare global {}
