import { reactive } from "vue";
import { api, closeSession } from '@Services/Api';
import { resetPermissions } from '@Plugins/RolePermission';

/**
 * Cache
 * 
 * Permite cargar los datos una vez para la sesión actual. Se mantienen mientras
 * no se recargue la página.
 */
const page = reactive({
    lang: 'es',
    app: {},
    user: {
        id: 0,
        name: 'public'
    }
})

/**
 * Recarga datos en cache
 */
const reloadApp = () => {
    const user = localStorage.user
    const app = localStorage.app

    if(user) {
        page.user = JSON.parse(user);
    }

    if(app) {
        page.app = JSON.parse(app);
    }
}

/**
 * Limpiar sesión de usuario
 */
const resetPage = () => {
    localStorage.removeItem('user');
}

/**
 * Permite buscar una opcionalmente
 */
const view = ({
    name = '',
    params = {},
    query = {},
}) => ({
    name: name,
    params,
    query,
})

/**
 * Almacenar datos usuario
 */
const defineUser = (user) => {
    localStorage.user = JSON.stringify({
        id: user.id,
        name: user.name,
        lastname: `${user.paternal} ${user?.maternal ?? ''}`,
        email: user.email,
        phone: user.phone,
        profile_photo_url: user.profile_photo_url,
        profile_photo_path: user.profile_photo_path,
    });
}

/**
 * Definir datos de la aplicación
 */
const defineApp = (app) => {
    localStorage.app = JSON.stringify(app);
}

/**
 * Instalar el componente de forma nativa
 */
const pagePlugin = {
    install: (app, options) => {
        app.config.globalProperties.$page = page;
        app.config.globalProperties.$view = view;
    }
}

/**
 * Reload user
 */
const reloadUser = () => {
    return api.get(route('user.show'), {
        onSuccess: (r) => {
            defineUser(r.user)
            reloadApp()

            return r.user;
        }
    });
}

/**
 * Cerrar sesión
 */
const logout = () => {
    resetPermissions()
    resetPage()
  
    api.post(route('auth.logout'), {
      onSuccess: (r) => {
        if(r.is_revoked === true) {
          closeSession()

          location.replace('/')
        }
      }
    });
};

export {
    pagePlugin,
    page,
    defineApp,
    defineUser,
    reloadApp,
    reloadUser,
    resetPage,
    logout,
    view
}