/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import {FimsPermissionDescriptor} from './fims-permission-descriptor';
import {IdentityPermittableGroupIds} from '../../identity/domain/permittable-group-ids.model';
import {OfficePermittableGroupIds} from '../../office/domain/permittable-group-ids.model';
import {CustomerPermittableGroupIds} from '../../customer/domain/permittable-group-ids';
import {AccountingPermittableGroupIds} from '../../accounting/domain/permittable-group-ids';
import {PortfolioPermittableGroupIds} from '../../portfolio/domain/permittable-group-ids';
import {PermissionId} from './permission-id.type';
import {Injectable} from '@angular/core';
import {DepositAccountPermittableGroupIds} from '../../depositAccount/domain/permittable-group-ids';
import {TellerPermittableGroupIds} from '../../teller/domain/permittable-group-ids';
import {ReportingPermittableGroupIds} from '../../reporting/domain/permittable-group-ids';
import {ChequePermittableGroupIds} from '../../cheque/domain/permittable-group-ids';
import {PayrollPermittableGroupIds} from '../../payroll/domain/permittable-group-ids';

interface PermittableGroupMap {
  [s: string]: FimsPermissionDescriptor;
}

/**
 * Maps permittable group ids to internal keys
 */
@Injectable()
export class PermittableGroupIdMapper {

  private _permittableGroupMap: PermittableGroupMap = {};

  constructor() {
    this._permittableGroupMap[OfficePermittableGroupIds.EMPLOYEE_MANAGEMENT] = {id: 'office_employees', label: 'Employees'};
    this._permittableGroupMap[OfficePermittableGroupIds.OFFICE_MANAGEMENT] = {id: 'office_offices', label: 'Offices'};
    this._permittableGroupMap[OfficePermittableGroupIds.SELF_MANAGEMENT] = {
      id: 'office_self',
      label: 'User created resources(Offices & Employees)'
    };

   
    this._permittableGroupMap[IdentityPermittableGroupIds.IDENTITY_MANAGEMENT] = {id: 'identity_identities', label: 'Identities'};
    this._permittableGroupMap[IdentityPermittableGroupIds.ROLE_MANAGEMENT] = {id: 'identity_roles', label: 'Roles'};
    this._permittableGroupMap[IdentityPermittableGroupIds.SELF_MANAGEMENT] = {
      id: 'identity_self',
      label: 'User created resources(Identity & Roles)'
    };

    this._permittableGroupMap[CustomerPermittableGroupIds.CUSTOMER_MANAGEMENT] = {id: 'customer_customers', label: 'Members'};
    this._permittableGroupMap[CustomerPermittableGroupIds.TASK_MANAGEMENT] = {id: 'customer_tasks', label: 'Tasks'};
    this._permittableGroupMap[CustomerPermittableGroupIds.CATALOG_MANAGEMENT] = {id: 'catalog_catalogs', label: 'Custom fields'};
    this._permittableGroupMap[CustomerPermittableGroupIds.IDENTITY_CARD_MANAGEMENT] = {
      id: 'customer_identifications',
      label: 'Member identification cards'
    };
    this._permittableGroupMap[CustomerPermittableGroupIds.PORTRAIT_MANAGEMENT] = {id: 'customer_portrait', label: 'Member portrait'};
    this._permittableGroupMap[CustomerPermittableGroupIds.CUSTOMER_DOCUMENT] = {id: 'customer_documents', label: 'Member documents'};

    this._permittableGroupMap[AccountingPermittableGroupIds.ACCOUNT_MANAGEMENT] = {id: 'accounting_accounts', label: 'Accounts'};
    this._permittableGroupMap[AccountingPermittableGroupIds.JOURNAL_MANAGEMENT] = {id: 'accounting_journals', label: 'Journal'};
    this._permittableGroupMap[AccountingPermittableGroupIds.LEDGER_MANAGEMENT] = {id: 'accounting_ledgers', label: 'Ledger'};
    this._permittableGroupMap[AccountingPermittableGroupIds.TRANSACTION_TYPES] = {id: 'accounting_tx_types', label: 'Transaction types'};
    this._permittableGroupMap[AccountingPermittableGroupIds.THOTH_INCOME_STMT] = {
      id: 'accounting_income_statement',
      label: 'Income statement'
    };
    this._permittableGroupMap[AccountingPermittableGroupIds.THOTH_FIN_CONDITION] = {
      id: 'accounting_fin_condition',
      label: 'Financial condition'
    };

    this._permittableGroupMap[PortfolioPermittableGroupIds.PRODUCT_OPERATIONS_MANAGEMENT] = {
      id: 'portfolio_product_operations',
      label: 'Loan product operations'
    };
    this._permittableGroupMap[PortfolioPermittableGroupIds.PRODUCT_LOSS_PROVISIONING_MANAGEMENT] = {
      id: 'portfolio_loss_provision', label: 'Loan loss provision'
    };
    this._permittableGroupMap[PortfolioPermittableGroupIds.PRODUCT_MANAGEMENT] = {id: 'portfolio_products', label: 'Loan products'};
    this._permittableGroupMap[PortfolioPermittableGroupIds.CASE_MANAGEMENT] = {id: 'portfolio_cases', label: 'Member loans'};
    this._permittableGroupMap[PortfolioPermittableGroupIds.CASE_DOCUMENT_MANAGEMENT] = {
      id: 'portfolio_documents',
      label: 'Member loan documents'
    };

    this._permittableGroupMap[DepositAccountPermittableGroupIds.DEFINITION_MANAGEMENT] = {
      id: 'deposit_definitions',
      label: 'Deposit account management'
    };
    this._permittableGroupMap[DepositAccountPermittableGroupIds.INSTANCE_MANAGEMENT] = {
      id: 'deposit_instances',
      label: 'Deposit account for members'
    };

    this._permittableGroupMap[TellerPermittableGroupIds.TELLER_MANAGEMENT] = {id: 'teller_management', label: 'Teller management'};
    this._permittableGroupMap[TellerPermittableGroupIds.TELLER_OPERATION] = {id: 'teller_operations', label: 'Teller operations'};

    this._permittableGroupMap[ReportingPermittableGroupIds.REPORT_MANAGEMENT] = {id: 'reporting_management', label: 'Report management'};

    this._permittableGroupMap[ChequePermittableGroupIds.CHEQUE_TRANSACTION] = {id: 'cheque_transaction', label: 'Cheque transaction'};
    this._permittableGroupMap[ChequePermittableGroupIds.CHEQUE_MANAGEMENT] = {id: 'cheque_management', label: 'Cheque management'};

    this._permittableGroupMap[PayrollPermittableGroupIds.CONFIGURATION] = {id: 'payroll_configuration', label: 'Payroll configuration'};
    this._permittableGroupMap[PayrollPermittableGroupIds.DISTRIBUTION] = {id: 'payroll_distribution', label: 'Payroll distribution'};
  }

  public map(permittableGroupId: string): FimsPermissionDescriptor {
    const descriptor: FimsPermissionDescriptor = this._permittableGroupMap[permittableGroupId];
    if (!descriptor) {
      console.warn(`Could not find permission descriptor for permittable group id '${permittableGroupId}'`);
    }
    return descriptor;
  }

  public isValid(id: PermissionId): boolean {
    for (const key in this._permittableGroupMap) {
      if (this._permittableGroupMap.hasOwnProperty(key)) {
        const descriptor: FimsPermissionDescriptor = this._permittableGroupMap[key];
        if (descriptor.id === id) {
          return true;
        }
      }
    }
    return false;
  }

}
