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

import { Component, ViewChild } from '@angular/core';
import { Grid } from './grid';
import { XHR } from './xhr';
import { Package } from '../model/package';
import { PackagesRepo } from '../repository/packages_repo';
import { Helper } from './helper';
import { ModalLimits } from  './modal_limits';
import { ViewModes }  from '../services/view_modes';
import { AppState } from '../app.service';
import { Access } from '../services/access';

@Component({
  selector: 'packages_grid',
  inputs: [
    'rows: rows', 'columns: columns',
    'rowsOnPage: rowsOnPage'
  ],
  template: require('./../../templates/packages_grid.html'),
  providers: [XHR, PackagesRepo, ViewModes],
  styles: [
    require('../../styles/packages.grid.less')
  ],
})
export class PackagesGrid extends Grid {
  rows: Array<Package>;

  constructor(
      private packagesRepo: PackagesRepo,
      public appState: AppState,
      private viewModeService: ViewModes,
      private accessService: Access
  ) {
    super(appState);
  }

  @ViewChild(ModalLimits) ModalLimits: ModalLimits;

  edit(row: Package){
      row.restoreCells();
      this.ModalLimits.loadEditing(row, this);
  }

  save(row){
    row.loadingStage = true;
    let params = this.parseParams(row.cells);
    if (/^\d+(\.\d+)?(KB\/s|MB\/s|G\/s)+$/i.test(params['io'])){
      params['io'] = (Helper.reformatToDirtyValue(params['io']) / 1024).toFixed();
    }

    this.packagesRepo.savePackage(row, params)
        .then(() => {
            this.updatePackageRow(row, false);
        })
        .catch(() => {
            row.loadingStage = false;
        });
  }

  private updatePackageRow(row: Package,  editing: boolean = false) {
    row.loadingStage = true;
    this.packagesRepo.getPackage(row.package_name, row.provider)
        .then((response: any) => {
          if (this.appState.get('isAdmin')) {
            this.viewModeService.detectPackageTypes(
                response, ViewModes.availableModesForPackages
            );
          }
          this.accessService.dropPermission(response, response['package'][0]);
          row.loadData(response, 0, editing);
          row.loadingStage = false;
        })
        .catch(() => {
          row.loadingStage = false;
        });
  }

  private parseParams(cells){
    let response = {};
    let inodes = {};
    for (let field in cells) {
      for (let line of cells[field].lines) {
          if (line.editing && line.hasChanged) {
              if (['inodes_soft', 'inodes_hard'].includes(line.paramName)) {
                  inodes[line.paramName] = line.value;
              } else {
                  response[line.paramName] = (line.value !== '') ? line.value : '0';
              }
          }
      }
    }
    if (Object.keys(inodes).length) {
        let inodes_soft = inodes['inodes_soft'] || cells['limits_inodes_soft'].lines[0].value;
        let inodes_hard = inodes['inodes_hard'] || cells['limits_inodes_hard'].lines[0].value;
        response['inodes'] = `${inodes_soft},${inodes_hard}`;
    }
    return response;
  }

}
