/*-
 * ============LICENSE_START=======================================================
 * SDC
 * ================================================================================
 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed 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.
 * ============LICENSE_END=========================================================
 */

'use strict';
import {SchemaPropertyGroupModel, SchemaProperty} from "./aschema-property";
import {InputPropertyBase} from "./input-property-base";

export class PropertiesGroup {
    constructor(propertiesObj?:PropertiesGroup) {
        _.forEach(propertiesObj, (properties:Array<PropertyModel>, instance) => {
            this[instance] = [];
            _.forEach(properties, (property:PropertyModel):void => {
                property.resourceInstanceUniqueId = instance;
                property.readonly = true;
                this[instance].push(new PropertyModel(property));
            });
        });
    }
}

export interface IPropertyModel extends InputPropertyBase {

    //server data
    constraints:Array<Object>;
    source:string;

    //instance properties
    valueUniqueUid:string;
    path:Array<string>;
    rules:Array<Object>;
    propertiesName:string;
    input:any;

    //custom properties
    resourceInstanceUniqueId:string;
    readonly:boolean;
    simpleType:string;
}

export class PropertyModel implements IPropertyModel {

    //server data
    uniqueId:string;
    name:string;
    constraints:Array<Object>;
    defaultValue:string;
    description:string;
    password:boolean;
    required:boolean;
    type:string;
    source:string;
    parentUniqueId:string;
    schema:SchemaPropertyGroupModel;
    componentInstanceId:string;
    parentValue:string;
    ownerId:string;

    //instance properties
    value:string;
    valueUniqueUid:string;
    path:Array<string>;
    rules:Array<Object>;
    propertiesName:string;
    input:any;

    //custom properties
    resourceInstanceUniqueId:string;
    readonly:boolean;
    simpleType:string;
    filterTerm:string;
    isAlreadySelected:boolean;
    addOn:string;


    constructor(property?:PropertyModel) {
        if (property) {
            this.uniqueId = property.uniqueId;
            this.name = property.name;
            this.constraints = property.constraints;
            this.defaultValue = property.defaultValue;
            this.description = property.description;
            this.password = property.password;
            this.required = property.required;
            this.type = property.type;
            this.source = property.source;
            this.parentUniqueId = property.parentUniqueId;
            this.schema = property.schema;
            this.value = property.value ? property.value : property.defaultValue;
            this.valueUniqueUid = property.valueUniqueUid;
            this.path = property.path;
            this.rules = property.rules;
            this.resourceInstanceUniqueId = property.resourceInstanceUniqueId;
            this.readonly = property.readonly;
            this.simpleType = property.simpleType;
            this.componentInstanceId = property.componentInstanceId;
            this.parentValue = property.parentValue;
            this.ownerId = property.ownerId;
        }

        if (!this.schema || !this.schema.property) {
            this.schema = new SchemaPropertyGroupModel(new SchemaProperty());
        } else {
            //forcing creating new object, so editing different one than the object in the table
            this.schema = new SchemaPropertyGroupModel(new SchemaProperty(this.schema.property));
        }
        if (property && property.uniqueId) {
            this.filterTerm = this.name + " " + (this.description || "") + " " + this.type.replace("org.openecomp.datatypes.heat.", "");
            if (this.schema.property && this.schema.property.type) {
                this.filterTerm += " " + this.schema.property.type.replace("org.openecomp.datatypes.heat.", "");
            }
        }
    }

    public convertToServerObject:Function = ():string => {
        let serverObject = {};
        let mapData = {
            "type": this.type,
            "required": this.required || false,
            "defaultValue": this.defaultValue != "" && this.defaultValue != "[]" && this.defaultValue != "{}" ? this.defaultValue : null,
            "description": this.description,
            "constraints": this.constraints,
            "isPassword": this.password || false,
            "schema": this.schema,
            "name": this.name
        };
        serverObject[this.name] = mapData;

        return JSON.stringify(serverObject);
    };

    public toJSON = ():any => {
        // if(!this.resourceInstanceUniqueId){
        //     this.value = undefined;
        // }
        let temp = angular.copy(this);
        temp.readonly = undefined;
        temp.resourceInstanceUniqueId = undefined;
        temp.simpleType = undefined;
        temp.value = temp.value === "{}" || temp.value === "[]" ? undefined : temp.value;
        temp.defaultValue = temp.defaultValue === "{}" || temp.defaultValue === "[]" ? undefined : temp.defaultValue;
        temp.rules = null; //don't send rules to server until feature is fully supported
        temp.isAlreadySelected = undefined;
        temp.addOn = undefined;
        return temp;
    };
}