import { getCorrectContext } from './contextOfObject';
import { Cache } from '../utils/exported';
import { IBindingContext } from '../interface/exported';

/**
  * simple function for setting value with token key
  *
  */
export function setValue(_class: IBindingContext, key: string, value: any) {

    _class = getCorrectContext(key, _class);
    _class = _class.__bindingContext ? _class.$context : _class;

    // types
    const keys = Cache.keyMaps.getCreate(key);
    try {
        let ref: any;
        // more then 1, then its array
        if (keys.length > 1) {
            keys.forEach((prop: any, i: number) => {
                if (prop) {
                    if (i === keys.length - 1) {
                        ref[prop] = value;
                    } else {
                        if (i === 0) {
                            ref = _class[prop];
                        } else {
                            ref = ref[prop];
                        }
                    }
                }
            });
        } else {
            _class[key] = value;
        }
    } catch (e) {

        // if key is not found, we will try and build it

        // first we make a object to what we want to build
        try {
            console.warn('key not found, rebuilding', key);
            let newObject = {};
            let ref: any;
            keys.forEach((prop: any, i: number) => {
                if (prop) {
                    if (i === keys.length - 1) {
                        if (i === 0) {
                            newObject[prop] = {};
                            ref = newObject[prop];
                        } else {
                            ref[prop] = value;
                        }
                    } else {
                        if (i === 0) {
                            newObject[prop] = {};
                            ref = newObject[prop];
                        } else {
                            ref[prop] = {};
                            ref = ref[prop];
                        }
                    }
                }
            });

            // not we add it to class

            // let refx = newObject;
            let classRef = _class;
            keys.forEach((prop: any, i: number) => {
                if (prop) {
                    if (i === keys.length - 1) {
                        if (!classRef[prop]) {
                            classRef[prop] = newObject[prop];
                        }
                    } else {
                        if (i === 0) {
                            if (!classRef[prop]) {
                                classRef[prop] = newObject[prop];
                            }
                            newObject = newObject[prop];
                            classRef = classRef[prop];
                        } else {
                            if (!classRef[prop]) {
                                classRef[prop] = newObject[prop];
                            }
                            newObject = newObject[prop];
                            classRef = classRef[prop];
                        }
                    }
                }
            });
        } catch (e) {
            console.error('key not found', key);
        }
    }
}
