// ═══════════════════════════════════════════════════
//  app/lib/types/user.types.ts
// ═══════════════════════════════════════════════════

export interface RoleRaw {
  id: number;
  name: string;
  description?: string | null;
  is_active?: boolean;
  created_at?: string;
  updated_at?: string;
}

export interface PermissionRaw {
  id: number;
  name: string;
  action: string;
  description?: string;
  module_id?: number;
  module?: {
    id: number;
    name: string;
    slug: string;
    api_prefix?: string;
    is_active?: boolean;
    description?: string;
  };
  created_at?: string;
  updated_at?: string;
}

// Raw shape from API
export interface UserRaw {
  id: number;
  firstName: string;
  lastName: string;
  email: string;
  isActive?: boolean;
  isEmailVerified?: boolean;
  isApprovedByAdmin?: boolean;
  status?: string;
  roles: RoleRaw[];
  permissions: PermissionRaw[];
  created_at: string;
  updated_at: string;
}

// Mapped/normalized shape used in components
export interface UserMapped {
  sno: number;
  id: number;
  firstName: string;
  lastName: string;
  fullName: string;
  email: string;
  isActive: boolean;
  isEmailVerified: boolean;
  isApprovedByAdmin: boolean;
  status: string;
  roles: RoleRaw[];
  permissions: PermissionRaw[];
  created_at: string;
  updated_at: string;
}

// ── DTOs ────────────────────────────────────────────

export interface CreateUserDto {
  firstName: string;
  lastName: string;
  email: string;
  password: string;
}

export interface UpdateUserDto {
  firstName?: string;
  lastName?: string;
  email?: string;
  password?: string;
}

export interface AssignRolesDto {
  roleIds: number[];
}

// ── Component Props ──────────────────────────────────

export interface UserFormProps {
  isOpen: boolean;
  onClose: () => void;
  refreshData?: () => void;
  userId?: number | null;
}

export interface RoleFormProps {
  isOpen: boolean;
  onClose: () => void;
  refreshData?: () => void;
  user: UserMapped | null;
  roles: RoleRaw[];
}

export interface UserRowProps {
  row: UserMapped;
  isExpanded: boolean;
  isSelected: boolean;
  toggleRowExpand: (sno: number) => void;
  handleRowSelect: (sno: number, checked: boolean) => void;
  onEdit: (id: number) => void;
  onDelete: (id: number) => void;
  onApprove: (id: number) => void;
  onReject: (id: number) => void;
  onVerify: (id: number) => Promise<void>; // ✅ add this line
  onManageRoles: (id: number) => void;
}

export interface UserFiltersProps {
  searchTerm: string;
  setSearchTerm: (v: string) => void;
  statusFilter: string;
  setStatusFilter: (v: string) => void;
  roleFilter: string;
  setRoleFilter: (v: string) => void;
  roles: RoleRaw[];
  clearFilters: () => void;
  onRefresh?: () => void;
}

export interface UserTableProps {
  refreshFlag?: boolean;
}

export interface UserHeaderProps {
  refreshData?: () => void;
}
