import { projectRoleSchema } from '@n8n/permissions';
import { z } from 'zod';

import { projectIconSchema } from './project.schema';
import { userSettingsSchema } from './user-settings.schema';

export const ROLE = {
	Owner: 'global:owner',
	Member: 'global:member',
	Admin: 'global:admin',
	ChatUser: 'global:chatUser',
	Default: 'default', // default user with no email when setting up instance
} as const;

export type Role = (typeof ROLE)[keyof typeof ROLE];

// A user's global role: either 'default' or a namespaced slug like 'global:owner'.
export const roleSchema = z.string().regex(/^(global:.+|default)$/);

export const userProjectSchema = z.object({
	id: z.string(),
	role: projectRoleSchema,
	name: z.string(),
	icon: projectIconSchema.nullable().optional(),
});

export const userBaseSchema = z.object({
	id: z.string(),
	firstName: z.string().nullable().optional(),
	lastName: z.string().nullable().optional(),
	email: z.string().email().nullable().optional(),
	role: roleSchema.optional(),
});

export const userDetailSchema = userBaseSchema.extend({
	isPending: z.boolean().optional(),
	isOwner: z.boolean().optional(),
	signInType: z.string().optional(),
	settings: userSettingsSchema.nullable().optional(),
	personalizationAnswers: z.object({}).passthrough().nullable().optional(),
	projectRelations: z.array(userProjectSchema).nullable().optional(),
	mfaEnabled: z.boolean().optional(),
	lastActiveAt: z.string().nullable().optional(),
	inviteAcceptUrl: z.string().optional(),
	isManagedByEnv: z.boolean().optional(),
});

export const usersListSchema = z.object({
	count: z.number(),
	items: z.array(userDetailSchema),
});

export type User = z.infer<typeof userDetailSchema>;
export type UsersList = z.infer<typeof usersListSchema>;
export type UserProject = z.infer<typeof userProjectSchema>;
