import { defineStore } from 'pinia';
import {Local, Session} from '/@/utils/storage';
import { getUserInfo, login, loginByMobile, loginBySocial, refreshTokenApi } from '/@/api/login/index';
import { useMessage } from '/@/hooks/message';
import { initUserTableConfigs } from '/@/api/admin/usertable';

/**
 * @function useUserInfo
 * @returns {UserInfosStore}
 */
export const useUserInfo = defineStore('userInfo', {
	state: (): UserInfosState => ({
		userInfos: {
			userName: '',
			photo: '',
			time: 0,
			roles: [],
			roleCodes: [],
			authBtnList: [],
		},
	}),

	actions: {
		/**
		 * 统一写入 token 到缓存（登录成功、URL 参数 token 等共用）
		 * @param token 访问令牌
		 * @param refreshToken 刷新令牌，可选
		 */
		setTokenCache(token: string, refreshToken?: string) {
			Session.set('token', token);
			if (refreshToken != null && refreshToken !== '') {
				Session.set('refresh_token', refreshToken);
			}
		},

		/**
		 * 登录方法
		 * @function login
		 * @async
		 * @param {Object} data - 登录数据
		 * @returns {Promise<Object>}
		 */
		async login(data:any) {
			data.grant_type = 'password';
			data.scope = 'server';
			return new Promise((resolve, reject) => {
				login(data)
					.then((res) => {
						this.setTokenCache(res.access_token, res.refresh_token);
						Local.remove('roleCode');
						Local.remove('roleName');
						Local.remove('roleId');
						resolve(res);
					})
					.catch((err) => {
						useMessage().error(err?.msg || '系统异常请联系管理员');
						reject(err);
					});
			});
		},

		/**
		 * 手机登录方法
		 * @function loginByMobile
		 * @async
		 * @param {Object} data - 登录数据
		 * @returns {Promise<Object>}
		 */
		async loginByMobile(data) {
			return new Promise((resolve, reject) => {
				loginByMobile(data.mobile, data.code)
					.then((res) => {
						this.setTokenCache(res.access_token, res.refresh_token);
						resolve(res);
					})
					.catch((err) => {
						useMessage().error(err?.msg || '系统异常请联系管理员');
						reject(err);
					});
			});
		},

		/**
		 * 社交账号登录方法
		 * @function loginBySocial
		 * @async
		 * @param {string} state - 状态
		 * @param {string} code - 代码
		 * @returns {Promise<Object>}
		 */
		async loginBySocial(state, code) {
			return new Promise((resolve, reject) => {
				loginBySocial(state, code)
					.then((res) => {
						this.setTokenCache(res.access_token, res.refresh_token);
						resolve(res);
					})
					.catch((err) => {
						useMessage().error(err?.msg || '系统异常请联系管理员');
						reject(err);
					});
			});
		},

		/**
		 * 刷新token方法
		 * @function refreshToken
		 * @async
		 * @returns {Promise<any>}
		 */
		async refreshToken() {
			return new Promise((resolve, reject) => {
				const refreshToken = Session.get('refresh_token');
				refreshTokenApi(refreshToken)
					.then((res) => {
						this.setTokenCache(res.access_token, res.refresh_token);
						resolve(res);
					})
					.catch((err) => {
						useMessage().error(err.msg);
						reject(err);
					});
			});
		},

		/**
		 * 获取用户信息方法
		 * @function setUserInfos
		 * @async
		 */
		async setUserInfos() {
			await getUserInfo().then((res) => {
				const userInfo: any = {
					user: res.data.sysUser,
					time: new Date().getTime(),
					roles: res.data.roles,
					roleCodes: res.data.roleCodes || [],
					authBtnList: res.data.permissions,
				};
				this.userInfos = userInfo;
				
				// 初始化用户表格配置（登录后获取一次所有配置并保存到本地）
				initUserTableConfigs().catch((err) => {
					console.error('初始化用户表格配置失败:', err);
				});
			});
		},
	},
});
