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

import { Component, OnInit, ViewChild } from '@angular/core';
import { PackagesRepo } from './repository/packages_repo';
import { Package } from './model/package';
import { Column } from './utils/column';
import { PackagesGrid } from './utils/packages_grid';
import { XHR } from './utils/xhr';
import { BaseComponent } from './utils/base_component';
import { Access } from './services/access';
import { AppState } from './app.service';
import { ViewModes } from './services/view_modes';
import { packageColumnInfo } from './utils/componentProperties/columnExtendedProperties';
import { LoaderSelector } from './utils/loader';

@Component({
  selector: '.packages_block',
  template: require('./../templates/packages.component.html'),
  styles: [],
  providers: [PackagesRepo, XHR, Access, ViewModes]
})
export class PackagesComponent extends BaseComponent {
    userType: string;
    packages: Array<Package>;
    originalPackages: Array<Package>;
    columns: Array<Column> = [];
    availableLimits: Array<string>;
    rowsOnPage: number = 25;

    @ViewChild(PackagesGrid) PackagesGrid: PackagesGrid;

    // Filter options
    private _filterField: string;
    set filterField(value: string) {
        this._filterField = value;
        if (typeof this.originalPackages !== 'undefined')
            this.doFilter();
    }
    get filterField(): string {
        return this._filterField;
    }

    constructor(
        private packagesRepo: PackagesRepo,
        private accessService: Access,
        public appState: AppState,
        private viewModeService: ViewModes
    ) {
        super();
        this.userType = this.appState.get('userType');
        // TODO: remove line below when reseller's plugin will be enabled for Plesk and DA
        this.availableViewModesForPackages = ViewModes.availableModesForPackages(appState)
            .filter((mode) => {
                return mode.active;
            });
        this.load();
    }

    load() {
        this.packagesRepo.getAllPackages()
            .then((data: any) => {
                if (this.appState.get('isAdmin')) {
                    this.viewModeService.detectPackageTypes(
                        data, this.viewModesForPackages
                    );
                }
                for (let pckg of data.package) {
                    this.accessService.dropPermission(data, pckg);
                }
                this.originalPackages = this.parsePackages(data);
                this.doFilter();
                this.columns = this.getColumns(data);
                this.PackagesGrid.key = this.columns[0].name;
                this.PackagesGrid.noFoundText = 'NO PACKAGES FOUND';
                this.loading = false;
            })
            .catch((data: any) => {
                this.loading = false;
            });
    }

    parsePackages(data) {
        return data.package.map((pckg, i) => {
            return new Package(data, i, this.appState);
        });
    }

    getColumns(data) {
        if (!data.package.length) {
            return [];
        }
        this.availableLimits = data['package'][0]['limits'];
        let columns = [
            new Column({name: 'package_name', descr: 'Package', convertToFormat: 'string'}),
            new Column({name: 'provider', descr: 'Provider', convertToFormat: 'string'})
        ];
        for (let column of packageColumnInfo) {
            if (this.availableLimits.hasOwnProperty(column.descr.toLowerCase())
                // TODO Remove this if column count in packages test will be changed
                && column.name !== 'limits_inodes_soft'
            ) {
                columns.push(new Column(column));
            }
        }
        columns.push(new Column({name: 'actions', descr: 'Actions', convertToFormat: 'string'})
            .sortableDisable());
        return columns;
    }

    public doFilter: Function = () => {
        let rows: Array<Package>;
        if (this.appState.get('isAdmin')) {
            rows = this.viewModeService.switchViewMode(
                this.availableViewModesForPackages,
                this.originalPackages,
                'packageType'
            );
        } else {
            rows = this.originalPackages;
        }

        if (typeof this.filterField  !== 'undefined' && this.filterField !== '') {
            this.packages = rows.filter(row => {
                return (row.package_name.includes(this.filterField)
                    || row.provider.includes(this.filterField));
            });
        } else {
            this.packages = rows;
        }

        this.PackagesGrid.noFound = (this.packages.length === 0);
  }

  ngAfterViewInit() {
        this.loaderSelector = new LoaderSelector('.packages_block');
        this.loading = true;
    }
}
