/* Copyright CloudLinux Zug GmbH 2010-2017 All Rights Reserved
 *
 * Licensed under CLOUD LINUX LICENSE AGREEMENT
 * http://cloudlinux.com/docs/LICENSE.TXT
 */

import { Component, EventEmitter, Output, Input } from '@angular/core';
import { Column } from './column';
import { ColumnHeader } from './column_header';
import { Grid } from './grid';
import { AppState } from '../app.service';
import { Caption } from '../model/caption';

@Component({
    selector: 'grid',
    inputs: [
        'rows: rows',
        'grouped_header: grouped_header',
        'context: context',
        'rowsOnPage: rowsOnPage'
    ],
    template: require('./../../templates/grouped_grid.html'),
    styles: [
        require('../../styles/grouped_grid.less')
    ],
})
export class GroupedGrid extends Grid {

    @Output('action')
    actionEmitter: EventEmitter<any> = new EventEmitter();

    @Input() tools: boolean = false;
    @Input() caption: Caption = null;
    @Input() loadMoreCount: number | boolean;
    @Input() loadedRowCount: number;
    @Input() enableGroupOperation: boolean = false;
    @Input() id: string;

    @Input() highlightPhrase: string = '';

    constructor(
        public appState: AppState
    ) {
        super(appState);
    }
    context: any;

    _grouped_header: boolean;
    get grouped_header(): boolean {
        return this._grouped_header;
    }
    set grouped_header(value: boolean){
        this._grouped_header = value;
        this._headers = null;
    }

    subheaders: Array<ColumnHeader> = [];
    _headers: Array<ColumnHeader> = null;
    get headers(): Array<ColumnHeader>{
        if (this._headers == null) {
            let component = this;
            this._headers = [];
            let groups = {};
            this.subheaders = [];
            this.columns.forEach(function(column: Column){
                let header = new ColumnHeader(column);

                if (component.grouped_header) {
                    if (header.isGroup) {
                        let subheader = new ColumnHeader(column);
                        subheader.isGroup = false;
                        subheader.colSpan = 1;
                        subheader.rowSpan = 1;
                        subheader.descr = column.descr;

                        component.subheaders.push(subheader);
                        if (groups.hasOwnProperty(column.group)) {
                            if (!column.hidden) {
                                groups[column.group]++;
                            }
                            return;
                        } else {
                            groups[column.group] = 1;
                        }
                    }
                } else {
                    header.rowSpan = 2;
                    header.colSpan = 1;
                    //header.descr = column.descr;
                    header.isGroup = false;
                }

                component._headers.push(header);
            });

            this._headers.forEach(function(header: ColumnHeader){
                if (header.isGroup)
                    header.colSpan = groups[header.descr];
            });
        }
        return this._headers;
    }

    private _columns: Column[];

    get columns(): Column[] {
        return this._columns;
    }
    set columns(val: Column[]) {
        this._columns = val;
        this._headers = null;
    }
    reset() {
        this._headers = null;
    }

    actionClick(event, action, row) {
        this.actionEmitter.emit({event, action, row});
    }
}
