// System-wide permissions and roles types
// These are distinct from zeiterfassung_roles - these control system access

// Permission categories by module
export type PermissionModule =
  | 'dashboard'
  | 'calendar'
  | 'data'
  | 'tasks'
  | 'bhb'
  | 'lorawan'
  | 'zeiterfassung'
  | 'system'
  | 'config';

export interface Permission {
  perm_id: number;
  perm_code: string;
  perm_name: string;
  perm_description?: string;
  perm_module: PermissionModule;
  perm_category: string;
  perm_active: boolean;
  created_at: string;
  updated_at: string;
  // For graph display
  x?: number;
  y?: number;
}

export interface SystemRole {
  role_id: number;
  role_name: string;
  role_description?: string;
  role_color: string;
  role_is_system: boolean;
  role_active: boolean;
  role_berechtigung: number;
  created_at: string;
  updated_at: string;
  deleted_at?: string | null;
  // Relations
  permissions?: Permission[];
  permissions_count?: number;
  users?: SystemUser[];
  users_count?: number;
  teams?: Team[];
  teams_count?: number;
  zeiterfassung_roles?: ZeiterfassungRoleLink[];
  // For graph display
  x?: number;
  y?: number;
}

// Pivot data for role-permission relationship
export interface RolePermission {
  rp_id: number;
  rp_role_id: number;
  rp_permission_id: number;
  rp_type: 'direct' | 'inherited';
  created_at: string;
  updated_at: string;
}

// User for system role assignment
export interface SystemUser {
  usr_id: number;
  usr_Vorname: string;
  usr_Name: string;
  usr_email?: string;
  full_name: string;
  initials: string;
  photourl?: string | null;
  // System role pivot data
  pivot?: {
    usr_role_id: number;
    usr_user_id: number;
    usr_assigned_at: string;
    usr_assigned_by?: number;
  };
  // Aggregated data
  system_roles?: SystemRole[];
  teams?: Team[];
  effective_permissions?: Permission[];
}

// Team for grouping users
export interface Team {
  team_id: number;
  team_name: string;
  team_description?: string;
  team_color: string;
  team_ber_id?: number | null;
  team_active: boolean;
  team_berechtigung: number;
  created_at: string;
  updated_at: string;
  deleted_at?: string | null;
  // Relations
  department?: Department;
  members?: TeamMember[];
  members_count?: number;
  roles?: SystemRole[];
  roles_count?: number;
  // For graph display
  x?: number;
  y?: number;
}

// Team member with pivot data
export interface TeamMember {
  usr_id: number;
  usr_Vorname: string;
  usr_Name: string;
  full_name: string;
  initials: string;
  photourl?: string | null;
  // Pivot data from mbd_team_members
  pivot?: {
    tm_id: number;
    tm_team_id: number;
    tm_user_id: number;
    tm_title?: string;
    tm_position?: number;
    tm_is_lead: boolean;
  };
  // For drag-and-drop state
  isLead?: boolean;
  title?: string;
  position?: number;
}

// Link between zeiterfassung roles and system roles (for shift permissions)
export interface ZeiterfassungRoleLink {
  zr_id: number;
  zr_name: string;
  zr_color: string;
  // Pivot data from mbd_shift_role_permissions
  pivot?: {
    srp_id: number;
    srp_zeiterfassung_role_id: number;
    srp_system_role_id: number;
    srp_active: boolean;
  };
}

// Active shift permission (temporary permission during shift)
export interface ActiveShiftPermission {
  asp_id: number;
  asp_user_id: number;
  asp_work_session_id: number;
  asp_role_id: number;
  asp_granted_at: string;
  asp_expires_at?: string | null;
  created_at: string;
  updated_at: string;
  // Relations
  role?: SystemRole;
  session?: {
    zfws_id: number;
    zfws_clock_in_time: string;
    zfws_clock_out_time?: string;
  };
}

// Department reference
export interface Department {
  ber_id: number;
  ber_name: string;
}

// API response types
export interface PermissionListResponse {
  data: Permission[];
  meta?: {
    total: number;
    per_page: number;
    current_page: number;
  };
}

export interface RoleListResponse {
  data: SystemRole[];
  meta?: {
    total: number;
    per_page: number;
    current_page: number;
  };
}

export interface TeamListResponse {
  data: Team[];
  meta?: {
    total: number;
    per_page: number;
    current_page: number;
  };
}

export interface ModulesResponse {
  data: PermissionModule[];
}

export interface CategoriesResponse {
  data: string[];
}

// Form types for creating/editing
export interface PermissionFormData {
  perm_code: string;
  perm_name: string;
  perm_description?: string;
  perm_module: PermissionModule;
  perm_category: string;
  perm_active: boolean;
}

export interface RoleFormData {
  role_name: string;
  role_description?: string;
  role_color: string;
  role_active: boolean;
  role_berechtigung?: number;
}

export interface TeamFormData {
  team_name: string;
  team_description?: string;
  team_color: string;
  team_ber_id?: number | null;
  team_active: boolean;
  team_berechtigung?: number;
}

export interface TeamMemberFormData {
  user_id: number;
  title?: string;
  is_lead?: boolean;
}

// Graph/Canvas types for visualization
export interface GraphNode {
  id: string;
  type: 'role' | 'permission' | 'team' | 'staff';
  data: SystemRole | Permission | Team | SystemUser;
  position: { x: number; y: number };
}

export interface GraphEdge {
  id: string;
  source: string;
  target: string;
  type: 'has_permission' | 'member_of' | 'has_role';
  animated?: boolean;
}

export interface GraphState {
  nodes: GraphNode[];
  edges: GraphEdge[];
  selectedNode: string | null;
  zoom: number;
  pan: { x: number; y: number };
}

// Permission sync request
export interface SyncPermissionsRequest {
  permission_ids: number[];
}

// Team roles sync request
export interface SyncTeamRolesRequest {
  role_ids: number[];
}

// Assign user to role request
export interface AssignUserRequest {
  user_id: number;
}

// Add team member request
export interface AddTeamMemberRequest {
  user_id: number;
  title?: string;
  is_lead?: boolean;
}

// Update team member request
export interface UpdateTeamMemberRequest {
  title?: string;
  position?: number;
  is_lead?: boolean;
}

// Link zeiterfassung role request
export interface LinkZeiterfassungRoleRequest {
  zeiterfassung_role_id: number;
  active?: boolean;
}

// Filter/query params
export interface PermissionFilters {
  module?: PermissionModule;
  category?: string;
  active?: boolean;
  search?: string;
}

export interface RoleFilters {
  active?: boolean;
  with_permissions?: boolean;
  with_users?: boolean;
  search?: string;
}

export interface TeamFilters {
  department_id?: number;
  active?: boolean;
  with_members?: boolean;
  with_roles?: boolean;
  search?: string;
}

// Drag and drop types for Team Builder
export interface DragItem {
  id: string;
  type: 'staff' | 'role';
  data: SystemUser | SystemRole;
}

export interface DropResult {
  teamId: number;
  item: DragItem;
  position?: number;
}
