'use strict';

import {isFunction, isString} from 'util';
import {BaseModel} from './BaseModel';
import {manager} from './manager';
import {
  IModelMetadata,
  IBaseModel, 
  IBaseModelConstructor
} from './interfaces';

export function isInstnace(model): boolean {
  return model instanceof BaseModel;
}

export function isConstructor(model): boolean {
  return (<any>model).prototype instanceof BaseModel;
}

export function getMetadata(model: IBaseModel | IBaseModelConstructor): IModelMetadata {
  if(isInstnace(model)) {
    return (<IBaseModelConstructor>model.constructor).metadata;
  } else {
    return (<IBaseModelConstructor>model).metadata;
  }
}

export function getCtor(model: IBaseModel): IBaseModelConstructor {
  return <IBaseModelConstructor>model.constructor;
}

export function getIdName(model: IBaseModel | IBaseModelConstructor): string {
  return getMetadata(model).idProperty.name;
}

export function getIdValue(model: IBaseModel): any {
  return model[getIdName(model)];
}

export function setIdValue(model: IBaseModel, id: any): void {
  model[getIdName(model)] = id;
}

export function getModel(model: IBaseModelConstructor | string): IBaseModelConstructor {
  if(isString(model)) {
    return manager.getModel(<string>model);
  } else {
    return <IBaseModelConstructor>model;
  }
} 