import { z } from 'zod';
import { ROLE_NAMES } from '../permissions';
import { AuthResponseSchema } from './auth';

/** Statut dérivé : invité = pas de mot de passe + lien émis ; désactivé prime. */
export const USER_STATUSES = ['active', 'invited', 'disabled'] as const;

export const UserAdminSchema = z.object({
  id: z.uuid(),
  email: z.email(),
  displayName: z.string(),
  phone: z.string().nullable(),
  role: z.object({ id: z.uuid(), name: z.enum(ROLE_NAMES) }),
  teams: z.array(z.object({ id: z.uuid(), name: z.string() })),
  status: z.enum(USER_STATUSES),
  isDemo: z.boolean(),
  /** Taux horaire COURANT (MAD/h) — chaque saisie de main-d'œuvre fige le sien. */
  hourlyRate: z.number().nullable(),
});
export type UserAdmin = z.infer<typeof UserAdminSchema>;

export const UsersResponseSchema = z.object({ users: z.array(UserAdminSchema) });
export type UsersResponse = z.infer<typeof UsersResponseSchema>;

export const RolesResponseSchema = z.object({
  roles: z.array(z.object({ id: z.uuid(), name: z.enum(ROLE_NAMES) })),
});
export type RolesResponse = z.infer<typeof RolesResponseSchema>;

export const UserUpdateSchema = z.object({
  displayName: z.string().min(1).max(120).optional(),
  phone: z.string().max(40).optional(),
  roleId: z.uuid().optional(),
  teamIds: z.array(z.uuid()).optional(), // remplace l'affectation
  isActive: z.boolean().optional(),
  hourlyRate: z.number().positive().nullable().optional(), // R3 — taux courant
});
export type UserUpdate = z.infer<typeof UserUpdateSchema>;

// ————— Invitation (maquettes R1 : jamais de mot de passe créé pour autrui) —————

export const InvitationCreateSchema = z.object({
  email: z.email(),
  displayName: z.string().min(1).max(120),
  roleId: z.uuid(),
  teamIds: z.array(z.uuid()).optional(),
  phone: z.string().max(40).optional(),
});
export type InvitationCreate = z.infer<typeof InvitationCreateSchema>;

/** Le lien est construit par le web (`/activation?token=…`) — l'API ne
 *  connaît pas son origine publique. L'envoi d'email viendra plus tard ;
 *  en R1 l'admin copie le lien depuis l'interface. */
export const InvitationResponseSchema = z.object({
  userId: z.uuid(),
  activationToken: z.string(),
  expiresAt: z.iso.datetime(),
});
export type InvitationResponse = z.infer<typeof InvitationResponseSchema>;

export const ActivateRequestSchema = z.object({
  token: z.string().min(10),
  password: z.string().min(8, '8 caractères minimum'),
});
export type ActivateRequest = z.infer<typeof ActivateRequestSchema>;

/** L'activation connecte directement la personne (AuthResponse). */
export const ActivateResponseSchema = AuthResponseSchema;
