import type { RouteRecordRaw } from 'vue-router'

import Home from '@/routes/Home.vue'
import Dashboard from '@/routes/dashboard/Dashboard.vue'
import NotFound from '@/routes/404NotFound.vue'
import Login from '@/routes/authentication/Login.vue'
import Impressum from '@/routes/Impressum.vue'

export enum Visibility {
  Hidden,
  Authenticated,
  Unauthenticated,
  Authorized,
  Public,
  Footer,
  Route,
}

export interface LayoutRoute {
  path: string
  name: string
  description: string
  icon: string
  disableFooter?: boolean
  visible: Visibility
  visibilityRoute?: string | string[]
  meta?: RouteRecordRaw
}

/**
 * Kurzanleitung fuer Sidebar-Sichtbarkeit:
 * - `Visibility.Public`: Eintrag ist immer in der Sidebar sichtbar.
 * - `Visibility.Route`: Eintrag ist nur sichtbar, wenn die aktuelle URL im angegebenen Bereich liegt.
 *   - Ohne `visibilityRoute` wird automatisch `path` als Bereich verwendet.
 *   - Szenario 1: `path: '/dash'` -> sichtbar bei `/dash` und `/dash/*`.
 *   - Szenario 2: `visibilityRoute: '/admin'` -> Eintrag wird nur im Admin-Bereich gezeigt.
 *   - Szenario 3: `visibilityRoute: ['/dash', '/projects']` -> sichtbar in beiden Bereichen.
 * - `Visibility.Footer` und `Visibility.Hidden`: nicht in der Sidebar sichtbar.
 */
export const routes: LayoutRoute[] = [
  {
    path: '/welcome',
    name: 'Startseite',
    description: 'Self-hosted Datei-Workspace für Hoard',
    icon: 'mdi-home',
    visible: Visibility.Unauthenticated,
    meta: {
      name: 'Home',
      path: '/welcome',
      component: Home,
    },
  },
  {
    path: '/',
    name: 'Dashboard',
    description: 'Geschützter Bereich für dein Konto',
    icon: 'mdi-view-dashboard-outline',
    visible: Visibility.Authenticated,
    meta: {
      name: 'Dashboard',
      path: '/',
      component: Dashboard,
      meta: {
        requiresAuth: true,
      },
    },
  },
  {
    path: '/login',
    name: 'Login',
    description: 'Logge dich ein',
    icon: 'mdi-login',
    visible: Visibility.Unauthenticated,
    meta: {
      path: '/login',
      name: 'Login',
      component: Login,
      meta: {
        guestOnly: true,
      },
    },
  },
  {
    path: '/impressum',
    name: 'Impressum',
    description: 'Impressum der Anwendung',
    icon: 'mdi-file-document',
    visible: Visibility.Footer,
    meta: {
      path: '/impressum',
      name: 'Impressum',
      component: Impressum,
    },
  },
  {
    path: '/notFound',
    name: 'Nicht gefunden',
    description: 'Diese Seite wurde nicht gefunden',
    icon: 'mdi-information-outline',
    visible: Visibility.Hidden,
    meta: { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
  },
]
