import type { ListMeta } from '@/interfaces/common';

// ── Dynamic Hierarchy Types ─────────────────────────────────────────────────

/** A single role as returned by the hierarchy API */
export interface RoleConfigRole {
  id: number;
  name: string;
  label: string;
  manager_role_id?: number | null;
  subordinate_role_id?: string | null;
  sort_order?: number;
  is_default?: number;
  city_id?: string | null;
}

/** A parent-child edge in the hierarchy tree */
export interface HierarchyEntry {
  parent_role_id: number;
  child_role_id: number;
}

export const LIST_META: ListMeta = {
  total: 0,
  count: 0,
  per_page: 10,
  current_page: 0,
  total_pages: 0,
};
type PermissionObject = {
    name: string
    path?: string[]
}

export const PERMISSIONS: Record<string, PermissionObject> = {
  MODULE_MASTER: {
    name: 'MODULE_MASTER',
    path: [
      '/cities',
      '/builders',
      '/customer',
      '/region',
      '/configuration',
      '/role',
      '/role/mapping',
      '/designations',
    ],
  },
  MODULE_LEADS: {
    name: 'LEAD_VIEW',
    path: ['/enquiries'],
  },
  LEAD_CREATE: {
    name: 'LEAD_CREATE',
    path: ['/enquiries/add-lead'],
  },
  LEAD_VIEW: {
    name: 'LEAD_VIEW',
    path: ['/enquiries', '/enquiries/view-lead/:path*', '/launches/view-edit-launch/:path*', '/super-hot-leads'],
  },
  MODULE_LEADS_REQUEST: {
    name: 'MODULE_LEADS_REQUEST',
    path: ['/lead-requests'],
  },
  LEAD_REQUEST_CREATE: {
    name: 'LEAD_REQUEST_CREATE',
    path: ['/lead-requests/add-leadRequest/:path*'],
  },

  EMPLOYEE_DELETE_ACCOUNT: {
    name: 'EMPLOYEE_DELETE_ACCOUNT',
  },
  EMPLOYEE_CHANGE_PASSWORD: {
    name: 'EMPLOYEE_CHANGE_PASSWORD',
  },
  EMPLOYEE_EDIT_ACCOUNT: {
    name: 'EMPLOYEE_EDIT_ACCOUNT',
    path: ['/employees/edit-employee', '/employees/add-employee'],
  },
  EMPLOYEE_VIEW_ACCOUNT: {
    name: 'EMPLOYEE_VIEW_ACCOUNT',
    path: ['/employees', '/employees/view-employee'],
  },
  PROJECT_VIEW: {
    name: 'PROJECT_VIEW',
    path: ['/launches', '/launches/view-project'],
  },
  PROJECT_CREATE: {
    name: 'PROJECT_CREATE',
    path: ['/launches/add-projects', '/launches/edit-project'],
  },
  LAUNCH_VIEW: {
    name: 'LAUNCH_VIEW',
    path: ['/launches', '/launches/view-edit-launch/:path*'],
  },
  LAUNCH_CREATE: {
    name: 'LAUNCH_CREATE',
    path: ['/launches/add-launch', '/launches/add-projects'],
  },
};

export const DefaultRoles = {
  super_admin: {
    id: 1,
    label: 'Super Admin',
  },
  team_lead: {
    id: 25,
    label: 'Team Lead',
  },
  team_head: {
    id: 2,
    label: 'Team Head',
  },
  cluster_manager: {
    id: 4,
    label: 'Reporting Manager',
  },
  pre_sales: {
    id: 10,
    label: 'Pre Sales',
  },
  field_sales: {
    id: 12,
    label: 'Field Sales',
  },
  city_head: {
    id: 13,
    label: 'City Head',
  },
  human_resources: {
    id: 15,
    label: 'Human Resources',
  },
  gm_sales: {
    id: 72,
    label: 'Gm Sales',
  },
  growth_head: {
    id: 73,
    label: 'Growth Head',
  },
  // Add more roles here as needed
};

/**
 * Update DefaultRoles from API data so that legacy code referencing
 * DefaultRoles.super_admin.id (etc.) stays correct even when IDs change.
 *
 * Matches each API role to a DefaultRoles key by name (case-insensitive,
 * underscore/space-normalized). Unmatched API roles are skipped.
 */
/**
 * Static baseline role list, derived from DefaultRoles. Used to seed the
 * RoleConfigProvider so that all role-driven UI (progressive dropdowns,
 * launch list, source analytics, etc.) renders correctly EVEN BEFORE — or
 * without — the /api/v1/hierarchy API responding. The API, when available,
 * refines/overrides these values; it is never a hard dependency for the UI.
 */
export function getDefaultRoleList(): RoleConfigRole[] {
  return Object.entries(DefaultRoles).map(([name, value], idx) => ({
    id: value.id,
    name,
    label: value.label,
    sort_order: idx,
  }));
}

/**
 * Static baseline hierarchy edges, mirroring backfill migration 008
 * (role_hierarchy). Keeps cascading dropdowns and scope checks working when
 * the hierarchy API is unavailable. Uses DefaultRoles IDs so it stays in sync.
 */
export function getDefaultHierarchy(): HierarchyEntry[] {
  const R = DefaultRoles;
  return [
    { parent_role_id: R.super_admin.id, child_role_id: R.city_head.id },
    { parent_role_id: R.city_head.id, child_role_id: R.gm_sales.id },
    { parent_role_id: R.gm_sales.id, child_role_id: R.cluster_manager.id },
    { parent_role_id: R.cluster_manager.id, child_role_id: R.team_lead.id },
    { parent_role_id: R.team_lead.id, child_role_id: R.field_sales.id },
    { parent_role_id: R.team_lead.id, child_role_id: R.pre_sales.id },
  ];
}

export function setDefaultRoles(apiRoles: RoleConfigRole[]): void {
  for (const apiRole of apiRoles) {
    // Normalize: "Cluster Manager" -> "cluster_manager"
    const normalizedName = apiRole.name
      .trim()
      .toLowerCase()
      .replace(/\s+/g, '_');

    if (normalizedName in DefaultRoles) {
      const key = normalizedName as keyof typeof DefaultRoles;
      DefaultRoles[key] = {
        ...DefaultRoles[key],
        id: apiRole.id,
        label: apiRole.label ?? DefaultRoles[key].label,
      };
    }
  }
}

export const LEADS_STATUS: { [key: string]: { id: number; name: string } } = {
  assigned: {
    id: 2,
    name: 'Assigned',
  },
  talkDone: {
    id: 3,
    name: 'Talk Done',
  },
  ringing: {
    id: 4,
    name: 'Ringing',
  },
  notReachable: {
    id: 5,
    name: 'Not Reachable',
  },
  switchOff: {
    id: 6,
    name: 'Switch Off',
  },
  interested: {
    id: 7,
    name: 'Interested',
  },
  scheduled_sv: {
    id: 8,
    name: 'Site visit scheduled',
  },
  scheduled_vc: {
    id: 9,
    name: 'VC scheduled',
  },
  scheduled_obm: {
    id: 10,
    name: 'OBM scheduled',
  },
  notInterested: {
    id: 11,
    name: 'Not Interested',
  },
  broker: {
    id: 12,
    name: 'Broker',
  },
  fake: {
    id: 13,
    name: 'Fake',
  },
  visit_sv: {
    id: 14,
    name: 'Site Visit Done',
  },
  visit_vc: {
    id: 15,
    name: 'VC Done',
  },
  visit_obm: {
    id: 16,
    name: 'OBM Done',
  },
  tokenDone: {
    id: 17,
    name: 'Token Done',
  },
  bookingDone: {
    id: 18,
    name: 'Booking Done',
  },
  bookingCancelled: {
    id: 19,
    name: 'Booking Cancelled',
  },
  dead: {
    id: 20,
    name: 'dead',
  },
  didNotAnswer: {
    id: 21,
    name: 'DidNotAnswer',
  },
  didNotShowUp: {
    id: 22,
    name: 'Didn\'t Show Up',
  },
};

export const PRE_SALES_STATUS = [
  LEADS_STATUS.visit_sv,
  LEADS_STATUS.visit_vc,
  LEADS_STATUS.visit_obm,
  LEADS_STATUS.talkDone,
  LEADS_STATUS.bookingDone,
  LEADS_STATUS.bookingCancelled,
  LEADS_STATUS.talkDone,
  LEADS_STATUS.ringing,
  LEADS_STATUS.interested,
  LEADS_STATUS.scheduled_vc,
];

export const allowedStatusIds = [
  {
    id: 2,
    name: 'Assigned',
  },
  {
    id: 14,
    name: 'Site Visit Done',
  },
  {
    id: 16,
    name: 'OBM Done',
  },
  {
    id: 15,
    name: 'VC Done',
  },
  {
    id: 4,
    name: 'Ringing',
  },
  {
    id: 5,
    name: 'Not Reachable',
  },
  {
    id: 6,
    name: 'Switch Off',
  },
  {
    id: 7,
    name: 'Interested',
  },
  {
    id: 22,
    name: 'Didn\'t Show Up',
  },
  {
    id: 3,
    name: 'Talk Done',
  },
  {
    id: 8,
    name: 'Site Visit Scheduled',
  },
  {
    id: 10,
    name: 'OBM Scheduled',
  },
  {
    id: 9,
    name: 'VC Scheduled',
  },
];

export const NAME_CONVERSION_METHOD = {
  CONVERT: 'convert',
  REVERT: 'revert',
}

export const VISIT_FLOW_STATUSES = [8, 9, 14, 15];

export const DEAD_LEAD_STATUS = [20, 19, 11, 12, 13];

export const ALL_TAB_OPTIONS = [
  'fresh_lead',
  'today_follow_up',
  'active',
  'scheduled',
  'overdue',
  'visited',
  'token_done',
  'dead',
];

export const TAB_LABEL_MAP: Record<string, string> = {
    fresh_lead: 'Fresh Lead',
    today_follow_up: 'Today\'s Follow Up',
    active: 'Active',
    scheduled: 'Scheduled',
    overdue: 'Overdue',
    visited: 'Visited',
    token_done: 'Token Done',
    dead: 'Dead',
  };