// Интерфейсы
import { IColumn, IColumnDefinition } from '../interfaces';

// Компоненты
import { CrmTableDefaultCellComponent } from '../components/crm-table-default-cell/crm-table-default-cell.component';

// Перечисления
import { SortType } from '../enums';

// Столбец
export class Column implements IColumn {

	// Флаг закрепленного столбца (по умолчанию)
	private static readonly IS_PINNED: boolean = false;

	// Флаг отображаемого столбца (по умолчанию)
	private static readonly IS_VISIBLE: boolean = true;

	// Флаг наличия сортировки (по умолчанию)
	private static readonly IS_SORTED: boolean = false;

	// Тип сортировки (по умолчанию)
	private static readonly SORT_TYPE: SortType = SortType.None;

	// Ширина столбца (по умолчанию)
	private static readonly WIDTH: number = 160;

	// Наименование столбца в шапке таблицы
	public headerName: string;

	// Наименование поля из обьекта строки
	public field: string;

	// Флаг закрепленного столбца
	public isPinned: boolean;

	// Флаг отображаемого столбца
	public isVisible: boolean;

	// Флаг наличия сортировки
	public isSorted: boolean;

	// Тип сортировки
	public sortType: SortType;

	// Ширина столбца
	public width: number;

	// Смещение от начала области отображения
	public offset: number;

	// Флаг перемещения
	public isSwap: boolean;

	// Компонент ячейки
	public component: any;

	// События
	public events: any;

	// Конструктор
	constructor(columnDefinition: IColumnDefinition) {
		this.headerName = columnDefinition.headerName;
		this.field = columnDefinition.field;
		this.events = columnDefinition.events;
		this.component = columnDefinition.component || CrmTableDefaultCellComponent;

		this.isPinned = columnDefinition.pinned != null
			? columnDefinition.pinned
			: Column.IS_PINNED;

		this.isVisible = columnDefinition.visible != null
			? columnDefinition.pinned
			: Column.IS_VISIBLE;

		this.isSorted = columnDefinition.sorted != null
			? columnDefinition.sorted
			: Column.IS_SORTED;

		this.sortType = Column.SORT_TYPE;

		this.width = columnDefinition.width != null
			? columnDefinition.width
			: Column.WIDTH;

		this.offset = 0;
		this.isSwap = false;
	}
}
