/* eslint-disable react-refresh/only-export-components -- This file exports data constants (icon maps, operator config), not React components */
import React from 'react';
import { Type, Hash, Calendar, CheckSquare } from 'lucide-react';
import type { FilterOperator, ShowMeScope, DateRange } from './types';

// ── Field type → icon mapping ──

export const FIELD_TYPE_ICON: Record<string, React.ReactNode> = {
    string: <Type size={12} className="text-slate-400" />,
    textarea: <Type size={12} className="text-slate-400" />,
    id: <Hash size={12} className="text-purple-400" />,
    int: <Hash size={12} className="text-blue-400" />,
    double: <Hash size={12} className="text-blue-400" />,
    currency: <Hash size={12} className="text-green-500" />,
    percent: <Hash size={12} className="text-orange-400" />,
    date: <Calendar size={12} className="text-amber-500" />,
    datetime: <Calendar size={12} className="text-amber-500" />,
    boolean: <CheckSquare size={12} className="text-teal-500" />,
    picklist: <CheckSquare size={12} className="text-indigo-400" />,
    multipicklist: <CheckSquare size={12} className="text-indigo-400" />,
    reference: <Hash size={12} className="text-purple-400" />,
};

const DEFAULT_FIELD_ICON = <Type size={12} className="text-slate-400" />;
export const getFieldIcon = (type: string) => FIELD_TYPE_ICON[type] || DEFAULT_FIELD_ICON;

// ── Filter Operator Constants ──

// ── Show Me: Scope options ──

export const SHOW_ME_SCOPE_OPTIONS: { value: ShowMeScope; label: string }[] = [
    { value: 'all', label: 'All' },
    { value: 'mine', label: 'My' },
    { value: 'myTeam', label: "My Team's" },
];

// ── Show Me: Date range options ──

export const DATE_RANGE_OPTIONS: { value: DateRange; label: string }[] = [
    { value: 'ALL_TIME', label: 'All Time' },
    { value: 'TODAY', label: 'Today' },
    { value: 'YESTERDAY', label: 'Yesterday' },
    { value: 'LAST_7_DAYS', label: 'Last 7 Days' },
    { value: 'LAST_30_DAYS', label: 'Last 30 Days' },
    { value: 'THIS_MONTH', label: 'This Month' },
    { value: 'LAST_MONTH', label: 'Last Month' },
    { value: 'THIS_QUARTER', label: 'This Quarter' },
    { value: 'LAST_QUARTER', label: 'Last Quarter' },
    { value: 'THIS_YEAR', label: 'This Year' },
    { value: 'LAST_YEAR', label: 'Last Year' },
];

/** Default Show Me filter state */
export const DEFAULT_SHOW_ME = {
    scope: 'all' as ShowMeScope,
    dateField: 'CreatedDate',
    dateRange: 'ALL_TIME' as DateRange,
};

/** Single source of truth for filter operator options — drives type, Set, JSX, and SOQL mapping. */
export const FILTER_OPERATOR_OPTIONS: { value: FilterOperator; label: string }[] = [
    { value: 'equals', label: 'equals' },
    { value: 'notEqual', label: 'not equal to' },
    { value: 'contains', label: 'contains' },
    { value: 'notContain', label: 'not contain' },
    { value: 'startsWith', label: 'starts with' },
    { value: 'lessThan', label: 'less than' },
    { value: 'greaterThan', label: 'greater than' },
    { value: 'lessOrEqual', label: 'less or equal' },
    { value: 'greaterOrEqual', label: 'greater or equal' },
];

/** Runtime validation set — derived from FILTER_OPERATOR_OPTIONS. */
export const FILTER_OPERATORS = new Set<string>(FILTER_OPERATOR_OPTIONS.map(o => o.value));

/** Maps UI filter operators to SOQL operators and value transforms. */
export const OPERATOR_TO_SOQL: Record<FilterOperator, { op: string; wrapValue?: (v: string) => string }> = {
    equals: { op: '=' },
    notEqual: { op: '!=' },
    lessThan: { op: '<' },
    greaterThan: { op: '>' },
    lessOrEqual: { op: '<=' },
    greaterOrEqual: { op: '>=' },
    contains: { op: 'LIKE', wrapValue: v => `%${v}%` },
    notContain: { op: 'NOT LIKE', wrapValue: v => `%${v}%` },
    startsWith: { op: 'LIKE', wrapValue: v => `${v}%` },
};
