require('./polyfill');
import Vue from 'vue';
window.Vue = Vue;
import VueRouter from "vue-router";
import Vuex from "vuex";
import { sync } from "vuex-router-sync";
import BootstrapVue from 'bootstrap-vue'
import InfiniteLoading from 'vue-infinite-loading';
import Loading from 'vue-loading-overlay';
import VueTimeago from 'vue-timeago';
import VueCarousel from 'vue-carousel';
import VueBlurHash from 'vue-blurhash';
import VueI18n from 'vue-i18n';
window.pftxt = require('twitter-text');
import 'vue-blurhash/dist/vue-blurhash.css'
window.filesize = require('filesize');
import swal from 'sweetalert';
window._ = require('lodash');
window.Popper = require('popper.js').default;
window.pixelfed = window.pixelfed || {};
window.$ = window.jQuery = require('jquery');
require('bootstrap');
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
require('readmore-js');
window.blurhash = require("blurhash");

$('[data-toggle="tooltip"]').tooltip()
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
	window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
	console.error('CSRF token not found.');
}

Vue.use(VueRouter);
Vue.use(Vuex);
Vue.use(VueBlurHash);
Vue.use(VueCarousel);
Vue.use(BootstrapVue);
Vue.use(InfiniteLoading);
Vue.use(Loading);
Vue.use(VueI18n);
Vue.use(VueTimeago, {
  name: 'Timeago',
  locale: 'en'
});

Vue.component(
	'photo-presenter',
	require('./../components/presenter/PhotoPresenter.vue').default
);

Vue.component(
	'video-presenter',
	require('./../components/presenter/VideoPresenter.vue').default
);

Vue.component(
	'photo-album-presenter',
	require('./../components/presenter/PhotoAlbumPresenter.vue').default
);

Vue.component(
	'video-album-presenter',
	require('./../components/presenter/VideoAlbumPresenter.vue').default
);

Vue.component(
	'mixed-album-presenter',
	require('./../components/presenter/MixedAlbumPresenter.vue').default
);

Vue.component(
	'navbar',
	require('./../components/landing/sections/nav.vue').default
);

Vue.component(
	'footer-component',
	require('./../components/landing/sections/footer.vue').default
);

import IndexComponent from "./../components/landing/Index.vue";
import DirectoryComponent from "./../components/landing/Directory.vue";
import ExploreComponent from "./../components/landing/Explore.vue";
import NotFoundComponent from "./../components/landing/NotFound.vue";

const router = new VueRouter({
	mode: "history",
	linkActiveClass: "",
	linkExactActiveClass: "active",

	routes: [
		{
			path: "/",
			component: IndexComponent
		},
		{
			path: "/web/directory",
			component: DirectoryComponent
		},
		{
			path: "/web/explore",
			component: ExploreComponent
		},
		{
			path: "/*",
			component: NotFoundComponent,
			props: true
		},
	],

	scrollBehavior(to, from, savedPosition) {
		if (to.hash) {
			return {
				selector: `[id='${to.hash.slice(1)}']`
			};
		} else {
			return { x: 0, y: 0 };
		}
	}
});

function lss(name, def) {
	let key = 'pf_m2s.' + name;
	let ls = window.localStorage;
	if(ls.getItem(key)) {
		let val = ls.getItem(key);
		if(['pl', 'color-scheme'].includes(name)) {
			return val;
		}
		return ['true', true].includes(val);
	}
	return def;
}

const store = new Vuex.Store({
	state: {
		version: 1,
		hideCounts: true,
		autoloadComments: false,
		newReactions: false,
		fixedHeight: false,
		profileLayout: 'grid',
		showDMPrivacyWarning: true,
		relationships: {},
		emoji: [],
		colorScheme: lss('color-scheme', 'system'),
	},

	getters: {
		getVersion: state => {
			return state.version;
		},

		getHideCounts: state => {
			return state.hideCounts;
		},

		getAutoloadComments: state => {
			return state.autoloadComments;
		},

		getNewReactions: state => {
			return state.newReactions;
		},

		getFixedHeight: state => {
			return state.fixedHeight;
		},

		getProfileLayout: state => {
			return state.profileLayout;
		},

		getRelationship: (state) => (id) => {
			return state.relationships[id];
		},

		getCustomEmoji: state => {
			return state.emoji;
		},

		getColorScheme: state => {
			return state.colorScheme;
		},

		getShowDMPrivacyWarning: state => {
			return state.showDMPrivacyWarning;
		}
	},

	mutations: {
		setVersion(state, value) {
			state.version = value;
		},

		setHideCounts(state, value) {
			localStorage.setItem('pf_m2s.hc', value);
			state.hideCounts = value;
		},

		setAutoloadComments(state, value) {
			localStorage.setItem('pf_m2s.ac', value);
			state.autoloadComments = value;
		},

		setNewReactions(state, value) {
			localStorage.setItem('pf_m2s.nr', value);
			state.newReactions = value;
		},

		setFixedHeight(state, value) {
			localStorage.setItem('pf_m2s.fh', value);
			state.fixedHeight = value;
		},

		setProfileLayout(state, value) {
			localStorage.setItem('pf_m2s.pl', value);
			state.profileLayout = value;
		},

		updateRelationship(state, relationships) {
			relationships.forEach((relationship) => {
				Vue.set(state.relationships, relationship.id, relationship)
			})
		},

		updateCustomEmoji(state, emojis) {
			state.emoji = emojis;
		},

		setColorScheme(state, value) {
			if(state.colorScheme == value) {
				return;
			}
			localStorage.setItem('pf_m2s.color-scheme', value);
			state.colorScheme = value;
			const name = value == 'system' ? '' : (value == 'light' ? 'force-light-mode' : 'force-dark-mode');
			document.querySelector("body").className = name;
			if(name != 'system') {
				const payload = name == 'force-dark-mode' ? { dark_mode: 'on' } : {};
				axios.post('/settings/labs', payload);
			}
		},

		setShowDMPrivacyWarning(state, value) {
			localStorage.setItem('pf_m2s.dmpwarn', value);
			state.showDMPrivacyWarning = value;
		}
	},
});

let i18nMessages = {
	en: require('./i18n/en.json'),
	ar: require('./i18n/ar.json'),
	ca: require('./i18n/ca.json'),
	de: require('./i18n/de.json'),
	el: require('./i18n/el.json'),
	es: require('./i18n/es.json'),
	eu: require('./i18n/eu.json'),
	fr: require('./i18n/fr.json'),
	he: require('./i18n/he.json'),
	gd: require('./i18n/gd.json'),
	gl: require('./i18n/gl.json'),
	id: require('./i18n/id.json'),
	it: require('./i18n/it.json'),
	ja: require('./i18n/ja.json'),
	nl: require('./i18n/nl.json'),
	pl: require('./i18n/pl.json'),
	pt: require('./i18n/pt.json'),
	ru: require('./i18n/ru.json'),
	uk: require('./i18n/uk.json'),
	vi: require('./i18n/vi.json'),
};

let locale = document.querySelector('html').getAttribute('lang');

const i18n = new VueI18n({
  locale: locale, // set locale
  fallbackLocale: 'en',
  messages: i18nMessages
});

sync(store, router);

const App = new Vue({
	el: '#content',
	i18n,
	router,
	store
});