<template>
<div>
	<MkHeader :info="header"/>

	<div class="edbbcaef">
		<div v-if="stats" class="cfcdecdf" style="margin: var(--margin)">
			<div class="number _panel">
				<div class="label">Users</div>
				<div class="value _monospace">
					{{ number(stats.originalUsersCount) }}
					<MkNumberDiff v-if="usersComparedToThePrevDay != null" class="diff" :value="usersComparedToThePrevDay" v-tooltip="$ts.dayOverDayChanges"><template #before>(</template><template #after>)</template></MkNumberDiff>
				</div>
			</div>
			<div class="number _panel">
				<div class="label">Notes</div>
				<div class="value _monospace">
					{{ number(stats.originalNotesCount) }}
					<MkNumberDiff v-if="notesComparedToThePrevDay != null" class="diff" :value="notesComparedToThePrevDay" v-tooltip="$ts.dayOverDayChanges"><template #before>(</template><template #after>)</template></MkNumberDiff>
				</div>
			</div>
		</div>

		<MkContainer :foldable="true" class="charts">
			<template #header><i class="fas fa-chart-bar"></i>{{ $ts.charts }}</template>
			<div style="padding-top: 12px;">
				<MkInstanceStats :chart-limit="500" :detailed="true"/>
			</div>
		</MkContainer>
		
			<!--<XMetrics/>-->

		<MkFolder style="margin: var(--margin)">
			<template #header><i class="fas fa-info-circle"></i> {{ $ts.info }}</template>
			<div class="cfcdecdf">
				<div class="number _panel">
					<div class="label">Misskey</div>
					<div class="value _monospace">{{ version }}</div>
				</div>
				<div class="number _panel" v-if="serverInfo">
					<div class="label">Node.js</div>
					<div class="value _monospace">{{ serverInfo.node }}</div>
				</div>
				<div class="number _panel" v-if="serverInfo">
					<div class="label">PostgreSQL</div>
					<div class="value _monospace">{{ serverInfo.psql }}</div>
				</div>
				<div class="number _panel" v-if="serverInfo">
					<div class="label">Redis</div>
					<div class="value _monospace">{{ serverInfo.redis }}</div>
				</div>
				<div class="number _panel">
					<div class="label">Vue</div>
					<div class="value _monospace">{{ vueVersion }}</div>
				</div>
			</div>
		</MkFolder>
	</div>
</div>
</template>

<script lang="ts">
import { computed, defineComponent, version as vueVersion } from 'vue';
import FormKeyValueView from '@client/components/debobigego/key-value-view.vue';
import MkInstanceStats from '@client/components/instance-stats.vue';
import MkButton from '@client/components/ui/button.vue';
import MkSelect from '@client/components/form/select.vue';
import MkNumberDiff from '@client/components/number-diff.vue';
import MkContainer from '@client/components/ui/container.vue';
import MkFolder from '@client/components/ui/folder.vue';
import { version, url } from '@client/config';
import bytes from '@client/filters/bytes';
import number from '@client/filters/number';
import MkInstanceInfo from './instance.vue';
import XMetrics from './metrics.vue';
import * as os from '@client/os';
import * as symbols from '@client/symbols';

export default defineComponent({
	components: {
		MkNumberDiff,
		FormKeyValueView,
		MkInstanceStats,
		MkContainer,
		MkFolder,
		XMetrics,
	},

	emits: ['info'],

	data() {
		return {
			[symbols.PAGE_INFO]: {
				title: this.$ts.dashboard,
				icon: 'fas fa-tachometer-alt',
				bg: 'var(--bg)',
			},
			header: {
				title: this.$ts.dashboard,
				icon: 'fas fa-tachometer-alt',
			},
			version,
			vueVersion,
			url,
			stats: null,
			meta: null,
			serverInfo: null,
			usersComparedToThePrevDay: null,
			notesComparedToThePrevDay: null,
			fetchJobs: () => os.api('admin/queue/deliver-delayed', {}),
			fetchModLogs: () => os.api('admin/show-moderation-logs', {}),
		}
	},

	async mounted() {
		this.$emit('info', this[symbols.PAGE_INFO]);

		os.api('meta', { detail: true }).then(meta => {
			this.meta = meta;
		});
		
		os.api('stats', {}).then(stats => {
			this.stats = stats;

			os.api('charts/users', { limit: 2, span: 'day' }).then(chart => {
				this.usersComparedToThePrevDay = this.stats.originalUsersCount - chart.local.total[1];
			});

			os.api('charts/notes', { limit: 2, span: 'day' }).then(chart => {
				this.notesComparedToThePrevDay = this.stats.originalNotesCount - chart.local.total[1];
			});
		});

		os.api('admin/server-info', {}).then(serverInfo => {
			this.serverInfo = serverInfo;
		});
	},

	methods: {
		async showInstanceInfo(q) {
			let instance = q;
			if (typeof q === 'string') {
				instance = await os.api('federation/show-instance', {
					host: q
				});
			}
			os.popup(MkInstanceInfo, {
				instance: instance
			}, {}, 'closed');
		},

		bytes,

		number,
	}
});
</script>

<style lang="scss" scoped>
.edbbcaef {
	.cfcdecdf {
		display: grid;
		grid-gap: 8px;
		grid-template-columns: repeat(auto-fill,minmax(150px,1fr));

		> .number {
			padding: 12px 16px;

			> .label {
				opacity: 0.7;
				font-size: 0.8em;
			}

			> .value {
				font-weight: bold;
				font-size: 1.2em;

				> .diff {
					font-size: 0.8em;
				}
			}
		}
	}

	> .charts {
		margin: var(--margin);
	}
}
</style>
