import { z } from 'zod';
import { Uuid } from './common';
import { USER_STATUS } from '../enums';

export const LoginSchema = z.object({
  tenantCode: z.string().trim().min(1).max(50),
  email: z.string().email(),
  password: z.string().min(1),
  deviceId: z.string().max(100).optional(), // RF device
});
export type LoginDto = z.infer<typeof LoginSchema>;

export const PlatformLoginSchema = z.object({
  email: z.string().email(),
  password: z.string().min(1),
});
export type PlatformLoginDto = z.infer<typeof PlatformLoginSchema>;

export const RefreshSchema = z.object({ refreshToken: z.string().min(10).optional() });

export const ChangePasswordSchema = z.object({
  currentPassword: z.string().min(1),
  newPassword: z.string().min(10).max(200),
});

export interface AuthTokens {
  accessToken: string;
  refreshToken: string;
  expiresIn: number; // seconds
}

export interface AuthUserProfile {
  id: string;
  tenantId: string;
  tenantCode: string;
  email: string;
  name: string;
  isTenantAdmin: boolean;
  storerId: string | null;
  permissions: string[];
  warehouses: { id: string; code: string; name: string; isDefault: boolean }[];
  roles: { code: string; name: string; warehouseId: string | null }[];
  features: string[];
}

export const CreateUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(1).max(120),
  phone: z.string().max(40).optional(),
  password: z.string().min(10).max(200).optional(), // if absent, user is INVITED
  isTenantAdmin: z.boolean().default(false),
  storerId: Uuid.nullable().optional(),
  roleIds: z.array(Uuid).default([]),
  warehouseIds: z.array(Uuid).default([]),
  defaultWarehouseId: Uuid.optional(),
  locale: z.string().max(10).default('en'),
});
export type CreateUserDto = z.infer<typeof CreateUserSchema>;

export const UpdateUserSchema = CreateUserSchema.partial().extend({
  status: z.enum(USER_STATUS).optional(),
});
export type UpdateUserDto = z.infer<typeof UpdateUserSchema>;

export const CreateRoleSchema = z.object({
  code: z.string().trim().min(1).max(50).regex(/^[A-Z0-9_]+$/),
  name: z.string().min(1).max(120),
  description: z.string().max(500).optional(),
  permissions: z.array(z.string()).min(1),
});
export type CreateRoleDto = z.infer<typeof CreateRoleSchema>;
export const UpdateRoleSchema = CreateRoleSchema.partial();

export const CreateApiKeySchema = z.object({
  name: z.string().min(1).max(120),
  storerId: Uuid.nullable().optional(),
  scopes: z.array(z.string()).min(1),
  rateLimitPerMinute: z.number().int().min(10).max(10000).default(600),
  expiresAt: z.string().datetime({ offset: true }).optional(),
});
export type CreateApiKeyDto = z.infer<typeof CreateApiKeySchema>;

export const API_SCOPES = [
  'items:write', 'items:read', 'asn:write', 'asn:read', 'orders:write', 'orders:read',
  'inventory:read', 'serials:read', 'billing:read', 'webhooks:manage',
] as const;
