import { PrintObject } from "./PrintObject";
import { Number } from "../dataType/Number";
import { List } from "../dataType/List";
import { gve } from "../gveesdk/gvee";
import { Array } from "../dataType/Array";
/**
 *  gve
 * @class gve.Dictionary
 * @since gve
 */
export class Dictionary extends PrintObject {

  args: any;

  /**
   * 构造Dictionary实例
   * @hideconstructor
   * @param {Dictionary|Object} [args] 构造函数参数
   * @returns gve.Dictionary
   */
  constructor(args?: Dictionary | Dictionary | object) {
    super();
    if (!(this instanceof Dictionary)) {
      return new Dictionary(args);
    }
    this.args = args;
  }

  /**
   * 从字典中提取命名值。如果字典不包含给定的键,则返回defaultValue,默认为null
   * @param {string|gve.String} key 要获取值的键
   * @param {Object} defaultValue 默认值
   * @returns Object
   */
  get(key: string|String, defaultValue: object = null):any {
    return new PrintObject();
  }

  /**
   * 从字典中提取命名数值
   * @param {string|gve.String} key 要获取值的键
   * @returns Number
   */
  getNumber(key: string|String) {
    return new Number();
  }

  /**
   * 根据键列表和值列表构造一个字典
   * @param {any[]|List<any>} key 键列表
   * @param {any[]|List<any>} value 值列表
   * @returns Dictionary
   * @tutorial gve.Dictionary
   */
  static fromLists(key: any[]|List<any>, value: any[]|List<any>) {
    return new Dictionary();
  }

  /**
   * 合并两个字典
   * @param {Dictionary} second 传入的字典
   * @param {Boolean} [overwrite] 是否重写
   * @returns Dictionary
   */
  combine(second:Dictionary, overwrite?:boolean){
    return new Dictionary();
  }

  /**
   * 如果字典包含给定的键,则返回true
   * @param {String} key 传入的键
   * @returns Boolean
   */
  contains(key:string){
    return new Boolean();
  }
  /**
   * 返回已删除指定键的字典
   * @param {any[]|List<any>} selectors 待移除的键列表
   * @param {Boolean} [ignoreMissing] 忽略至少一个不匹配的键
   * @returns Dictionary
   */
  remove(selectors:any[]|List<any> , ignoreMissing?:boolean){
    return new Dictionary();
  }

  /**
   * 重命名字典中的元素
   * @param {any[]|List<any>} from 需要重命名的键
   * @param {any[]|List<any>} to 重命名键的新名称
   * @param {Boolean} [overwrite] 是否允许重命名已经存在的键
   * @returns Dictionary
   */
  rename(from:any[]|List<any>, to:any[]|List<any>, overwrite?:boolean){
    return new Dictionary();
  }

  /**
   * 返回只包含指定键的字典。
   * @param {List<any>|any[]} selectors 选择的键
   * @param {Boolean} [ignoreMissing] 忽略的键
   * @returns Dictionary
   */
  select(selectors:List<any>|any[], ignoreMissing?:boolean){
    return new Dictionary();
  }
  /**
   * 在字典中设置值
   * @param {String} key 设置的键
   * @param {any} [value] 设置的值
   * @returns Dictionary
   */
  set(key:string, value?:any){
    return new Dictionary();
  }

  /**
   * 返回字典中键的数目
   * @returns Number
   */
  size(){
    return new Number();
  }

  /**
   * 以数组形式返回字典的数值
   * @param {List<any>|any[]} keys 选择的键
   * @param {Number} [axis] 轴
   * @returns Array
   */
  toArray(keys:List<any>|any[], axis?:number){
    return new Array();
  }
  /**
   * 获取字典中键的值
   * @param {List<any>|any[]} [keys] 待获取值的键列表
   * @returns List
   */
  values(keys?:List<any>|any[]){
    return new List();
  }

  /**
   * 以列表的形式检索字典的键。键将按自然顺序排序
   * @returns List
   */
  keys(){
    return new List();
  }
  /**
   * 从字典中提取命名字符串值
   * @param {String} key 传入的键
   * @returns String
   */
  getString(key:string){
    return new String();
  }

}