import {Injectable} from "@angular/core";
import {HttpParams} from "@angular/common/http";
import {FormGroup} from "@angular/forms";
import {filter} from "rxjs/operators";

@Injectable({
  providedIn: 'root'
})

export class UtilityService {
  normalizeData(data: any) {
    for (let prop in data) {
      if (data.hasOwnProperty(prop)) {
        data[prop] = this.normalizeValue(data[prop]);
      }
    }
    return data;
  }
  normalizeValue(value: any) {
    let result = value;
    if (Array.isArray(value)) {
      result = value.map(val => {return this.normalizeValue(val)}).filter(val => {return (val !== null) && (val !== undefined)});
      if (!result.length) result = null;
    } else if (value instanceof FormGroup) result = this.normalizeData(value.value);
    else if (value?.id) result = value.id;
    return result;
  }



  filterOptions(search: string, options: []) {
    let result: any = options;
    if (search) {
      let regExps = this.getSearchRegexps(search);
      result = options.filter((option: any) => {
        return this.testOption(option, regExps);
      });
    }
    return result;
  }
  testOption(option: any, regExps: RegExp[]) {
    let result = true;
    regExps.forEach((regExp: RegExp) => {
      if (!regExp.test(option.caption) && !regExp.test(option.title) && !regExp.test(option.subtitle) && !regExp.test(option.name)) result = false;
    });
    return result;
  }
  getSearchRegexps(search: string) {
    return search.split(' ').map(term => {
      return new RegExp(term.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'i');
    });
  }




  makeHttpParams(params: any): HttpParams {
    let result = new HttpParams()
    for (let param in params) {
      if (Object.prototype.hasOwnProperty.call(params, param)) {
        if (params[param] !== null && params[param] !== '') {
          if (typeof params[param] === 'object') {
            for (let param2 in params[param]) {
              if (Object.prototype.hasOwnProperty.call(params[param], param2)) {
                if (params[param][param2] !== null && params[param][param2] !== '') {
                  result = result.append(param + '[' + param2 + ']', params[param][param2])
                }
              }
            }
          } else {
            result = result.append(param, params[param])
          }
        }
      }
    }
    return result
  }
}
