import Core from '../../core';
import { BasePlugin } from '../base';
import ConditionCollection from './conditionCollection';
import ConditionUpdateObserver from './conditionUpdateObserver';

type _OperationType = 'conjunction' | 'disjunction';
export type OperationType = _OperationType;

type _ConditionName = 'begins_with' | 'between' | 'by_value' | 'contains' | 'empty' |
  'ends_with' | 'eq' | 'gt' | 'gte' | 'lt' | 'lte' | 'not_between' | 'not_contains' |
  'not_empty' | 'neq';
export type ConditionName = _ConditionName;

export interface ColumnConditions {
  column: number;
  conditions: ConditionId[];
  operation: OperationType;
}

export interface ConditionId {
  args: any[];
  name?: ConditionName;
  command?: {
    key: ConditionName;
  };
}

export interface CellLikeData {
  meta: {
    row: number;
    col: number;
    visualCol: number;
    visualRow: number;
    type: string;
    instance: Core;
    dateFormat?: string;
  };
  value: string;
}

export type Settings = boolean;

export declare class Filters extends BasePlugin {
  constructor(hotInstance: Core);

  conditionUpdateObserver: ConditionUpdateObserver;
  conditionCollection: ConditionCollection;

  isEnabled(): boolean;
  addCondition(column: number, name: string, args: any[], operationId?: OperationType): void;
  removeConditions(column: number): void;
  clearConditions(column?: number): void;
  filter(): void;
  getSelectedColumn(): number;
  getDataMapAtColumn(column?: number): CellLikeData[];
}
