import { z } from "zod";
import { ALL_PERMISSIONS } from "@/types/auth";

export const createEmployeeSchema = z.object({
  userEmail: z.string().email("Invalid user email address"),
  jobTitle: z.string().min(2, "Job title is required").max(100),
  department: z.string().min(2, "Department is required").max(100),
  permissions: z.array(z.enum(ALL_PERMISSIONS as [string, ...string[]])).min(1, "Assign at least one permission"),
});

export const updateEmployeeSchema = z.object({
  employeeId: z.string().uuid("Invalid employee ID"),
  jobTitle: z.string().max(100).optional(),
  department: z.string().max(100).optional(),
  permissions: z.array(z.enum(ALL_PERMISSIONS as [string, ...string[]])).optional(),
  isActive: z.boolean().optional(),
});

export const grantOverrideSchema = z.object({
  targetUserId: z.string().uuid().optional().nullable(),
  targetAgencyId: z.string().uuid().optional().nullable(),
  entitlementKey: z.enum([
    "max_active_listings",
    "featured_listing_credits",
    "sub_agents_allowed",
    "lead_analytics_enabled",
    "verified_agency_badge",
    "custom_branding",
  ]),
  overrideValue: z.union([z.number(), z.boolean(), z.string()]),
  reason: z.string().min(5, "Please provide a valid business reason (at least 5 characters)").max(500),
  expiresAt: z.string().optional().nullable(),
}).refine((data) => data.targetUserId || data.targetAgencyId, {
  message: "Please specify either a Target User ID or a Target Agency ID",
});

export const revokeOverrideSchema = z.object({
  overrideId: z.string().uuid("Invalid override ID"),
});

export const auditLogFilterSchema = z.object({
  search: z.string().optional(),
  action: z.string().optional(),
  entityType: z.string().optional(),
  actorId: z.string().optional(),
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().default(25),
});

export const createUserSchema = z.object({
  firstName: z.string().min(1, "First name is required").max(100),
  lastName: z.string().min(1, "Last name is required").max(100),
  email: z.string().email("Invalid user email address"),
  phoneNumber: z.string().max(30).optional().nullable(),
  whatsappNumber: z.string().max(30).optional().nullable(),
  password: z.string().min(8, "Password must be at least 8 characters").optional().nullable(),
  role: z.enum([
    "CUSTOMER",
    "AGENT",
    "AGENCY_ADMIN",
    "PROPERTY_OWNER",
    "EMPLOYEE",
    "SUPER_ADMIN",
  ]),
  // Agent optional agency assignment
  agencyId: z.string().uuid("Invalid agency ID").optional().nullable(),
  agentRoleInAgency: z.enum(["AGENT", "COORDINATOR", "ADMIN"]).default("AGENT").optional().nullable(),
  // Agency details if role is AGENCY_ADMIN
  agencyName: z.string().max(200).optional().nullable(),
  cacRcNumber: z.string().max(50).optional().nullable(),
  taxIdNumber: z.string().max(50).optional().nullable(),
  officeAddress: z.string().max(500).optional().nullable(),
  agencyPhone: z.string().max(30).optional().nullable(),
  stateId: z.number().int().optional().nullable(),
  lgaId: z.number().int().optional().nullable(),
  // Staff details if role is EMPLOYEE
  jobTitle: z.string().max(100).optional().nullable(),
  department: z.string().max(100).optional().nullable(),
  permissions: z.array(z.enum(ALL_PERMISSIONS as [string, ...string[]])).optional().nullable(),
});

export const userFilterSchema = z.object({
  search: z.string().optional(),
  role: z.enum(["ALL", "CUSTOMER", "AGENT", "AGENCY_ADMIN", "PROPERTY_OWNER", "EMPLOYEE", "SUPER_ADMIN"]).default("ALL").optional(),
  status: z.enum(["ALL", "ACTIVE", "DISABLED"]).default("ALL").optional(),
  page: z.coerce.number().int().positive().default(1),
  limit: z.coerce.number().int().positive().default(50),
});

export type CreateUserInput = z.infer<typeof createUserSchema>;
export type UserFilterInput = z.infer<typeof userFilterSchema>;
export type CreateEmployeeInput = z.infer<typeof createEmployeeSchema>;
export type UpdateEmployeeInput = z.infer<typeof updateEmployeeSchema>;
export type GrantOverrideInput = z.infer<typeof grantOverrideSchema>;
export type RevokeOverrideInput = z.infer<typeof revokeOverrideSchema>;
export type AuditLogFilterInput = z.infer<typeof auditLogFilterSchema>;

