/**
 * ERP Roles Configuration
 *
 * Define roles, tools permitidos, y system prompts para cada rol en el ERP.
 * Basado en: michangarrito MCH-012/MCH-013 (role-based chatbot)
 *
 * Roles disponibles:
 * - ADMIN: Acceso completo a todas las operaciones
 * - SUPERVISOR: Gestión de equipos y reportes de sucursal
 * - OPERATOR: Operaciones de punto de venta
 * - CUSTOMER: Acceso limitado para clientes (si se expone chatbot)
 */

export type ERPRole = 'ADMIN' | 'SUPERVISOR' | 'OPERATOR' | 'CUSTOMER';

export interface ERPRoleConfig {
  name: string;
  description: string;
  tools: string[];
  systemPromptFile: string;
  maxConversationHistory: number;
  allowedModels?: string[]; // Si vacío, usa el default del tenant
  rateLimit: {
    requestsPerMinute: number;
    tokensPerMinute: number;
  };
}

/**
 * Configuración de roles ERP
 */
export const ERP_ROLES: Record<ERPRole, ERPRoleConfig> = {
  ADMIN: {
    name: 'Administrador',
    description: 'Acceso completo a todas las operaciones del sistema ERP',
    tools: [
      // Ventas
      'get_sales_summary',
      'get_sales_report',
      'get_top_products',
      'get_top_customers',
      'get_sales_by_branch',
      'create_sale',
      'void_sale',

      // Inventario
      'get_inventory_status',
      'get_low_stock_products',
      'get_inventory_value',
      'adjust_inventory',
      'transfer_inventory',

      // Compras
      'get_pending_orders',
      'get_supplier_info',
      'create_purchase_order',
      'approve_purchase',

      // Finanzas
      'get_financial_report',
      'get_accounts_receivable',
      'get_accounts_payable',
      'get_cash_flow',

      // Usuarios y configuración
      'manage_users',
      'view_audit_logs',
      'update_settings',
      'get_branch_info',
      'manage_branches',

      // Reportes avanzados
      'generate_report',
      'export_data',
      'get_kpis',
    ],
    systemPromptFile: 'admin-system-prompt',
    maxConversationHistory: 50,
    rateLimit: {
      requestsPerMinute: 100,
      tokensPerMinute: 50000,
    },
  },

  SUPERVISOR: {
    name: 'Supervisor',
    description: 'Gestión de equipos, reportes de sucursal y aprobaciones',
    tools: [
      // Ventas (lectura + acciones limitadas)
      'get_sales_summary',
      'get_sales_report',
      'get_top_products',
      'get_sales_by_branch',
      'create_sale',

      // Inventario (lectura + ajustes)
      'get_inventory_status',
      'get_low_stock_products',
      'adjust_inventory',

      // Equipo
      'get_team_performance',
      'get_employee_schedule',
      'manage_schedules',

      // Aprobaciones
      'approve_discounts',
      'approve_voids',
      'approve_refunds',

      // Sucursal
      'get_branch_info',
      'get_branch_report',

      // Clientes
      'get_customer_info',
      'get_customer_balance',
    ],
    systemPromptFile: 'supervisor-system-prompt',
    maxConversationHistory: 30,
    rateLimit: {
      requestsPerMinute: 60,
      tokensPerMinute: 30000,
    },
  },

  OPERATOR: {
    name: 'Operador',
    description: 'Operaciones de punto de venta y consultas básicas',
    tools: [
      // Productos
      'search_products',
      'get_product_price',
      'check_product_availability',

      // Ventas
      'create_sale',
      'get_my_sales',
      'apply_discount', // Con límite

      // Clientes
      'search_customers',
      'get_customer_balance',
      'register_payment',

      // Inventario (solo lectura)
      'check_stock',

      // Información
      'get_branch_hours',
      'get_promotions',
    ],
    systemPromptFile: 'operator-system-prompt',
    maxConversationHistory: 20,
    rateLimit: {
      requestsPerMinute: 30,
      tokensPerMinute: 15000,
    },
  },

  CUSTOMER: {
    name: 'Cliente',
    description: 'Acceso limitado para clientes externos',
    tools: [
      // Catálogo
      'view_catalog',
      'search_products',
      'check_availability',

      // Pedidos
      'get_my_orders',
      'track_order',

      // Cuenta
      'get_my_balance',
      'get_my_history',

      // Soporte
      'contact_support',
      'get_store_info',
      'get_promotions',
    ],
    systemPromptFile: 'customer-system-prompt',
    maxConversationHistory: 10,
    rateLimit: {
      requestsPerMinute: 10,
      tokensPerMinute: 5000,
    },
  },
};

/**
 * Mapeo de rol de base de datos a ERPRole
 */
export const DB_ROLE_MAPPING: Record<string, ERPRole> = {
  // Roles típicos de sistema
  admin: 'ADMIN',
  administrator: 'ADMIN',
  superadmin: 'ADMIN',
  owner: 'ADMIN',

  // Supervisores
  supervisor: 'SUPERVISOR',
  manager: 'SUPERVISOR',
  branch_manager: 'SUPERVISOR',
  store_manager: 'SUPERVISOR',

  // Operadores
  operator: 'OPERATOR',
  cashier: 'OPERATOR',
  sales: 'OPERATOR',
  employee: 'OPERATOR',
  staff: 'OPERATOR',

  // Clientes
  customer: 'CUSTOMER',
  client: 'CUSTOMER',
  guest: 'CUSTOMER',
};

/**
 * Obtener rol ERP desde rol de base de datos
 */
export function getERPRole(dbRole: string | undefined): ERPRole {
  if (!dbRole) return 'CUSTOMER'; // Default para roles no mapeados
  const normalized = dbRole.toLowerCase().trim();
  return DB_ROLE_MAPPING[normalized] || 'CUSTOMER';
}

/**
 * Verificar si un rol tiene acceso a un tool
 */
export function hasToolAccess(role: ERPRole, toolName: string): boolean {
  const roleConfig = ERP_ROLES[role];
  if (!roleConfig) return false;
  return roleConfig.tools.includes(toolName);
}

/**
 * Obtener todos los tools para un rol
 */
export function getToolsForRole(role: ERPRole): string[] {
  const roleConfig = ERP_ROLES[role];
  return roleConfig?.tools || [];
}

/**
 * Obtener configuración completa de un rol
 */
export function getRoleConfig(role: ERPRole): ERPRoleConfig | null {
  return ERP_ROLES[role] || null;
}
