package org.gsonformat.intellij.entity;

import com.intellij.psi.PsiClass;
import org.apache.http.util.TextUtils;
import org.gsonformat.intellij.common.CheckUtil;
import org.jdesktop.swingx.ux.CellProvider;
import org.jdesktop.swingx.ux.Selector;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by dim on 2015/7/15.
 */
public class ClassEntity implements Selector, CellProvider {

    private PsiClass psiClass;
    private String fieldTypeSuffix;
    private String className;
    private List<FieldEntity> fields = new ArrayList<>();
    private List<ClassEntity> innerClasss = new ArrayList<>();
    private String packName;
    /**
     * 存储 comment
     */
    private String extra;
    private boolean generate = true;
    private boolean lock = false;

    public boolean isLock() {
        return lock;
    }

    public void setLock(boolean lock) {
        this.lock = lock;
    }

    public boolean isGenerate() {
        return generate;
    }

    public void setGenerate(boolean generate) {
        this.generate = generate;
    }

    public String getExtra() {
        return extra;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }

    public void addAllFields(List fields) {
        this.fields.addAll(fields);
    }

    public void addField(FieldEntity fieldEntity) {
        this.fields.add(fieldEntity);
    }

    public void addInnerClass(ClassEntity classEntity) {
        this.innerClasss.add(classEntity);
    }

    public List<ClassEntity> getInnerClasss() {
        return innerClasss;
    }

    public String getPackName() {
        return packName;
    }

    public void setPackName(String packName) {
        this.packName = packName;
    }


    public String getFieldTypeSuffix() {
        return fieldTypeSuffix;
    }

    public void setFieldTypeSuffix(String fieldTypeSuffix) {
        this.fieldTypeSuffix = fieldTypeSuffix;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className =  CheckUtil.getInstant().handleArg(className);
    }

    public List<? extends FieldEntity> getFields() {
        return fields;
    }

    public PsiClass getPsiClass() {
        return psiClass;
    }

    public void setPsiClass(PsiClass psiClass) {
        this.psiClass = psiClass;
    }

    public String getQualifiedName() {
        String fullClassName;
        if (!TextUtils.isEmpty(packName)) {
            fullClassName = packName + "." + className;
        } else {
            fullClassName = className;
        }

        return fullClassName;
    }

    @Override
    public void setSelect(boolean select) {
        setGenerate(select);
    }

    public boolean isSame(JSONObject o) {
        if (o == null) {
            return false;
        }
        boolean same = true;
        for (String key : o.keySet()) {
            same = false;
            for (FieldEntity field : fields) {
                if (field.getKey().equals(key)) {
                    if (field.isSameType(o.get(key))) {
                        same = true;
                    }
                    break;
                }
            }
            if (!same) {
                break;
            }
        }
        return same;
    }


    @Override
    public String getCellTitle(int index) {
        String result = "";
        switch (index) {
            case 0:
                result = getClassName();
                break;

            case 3:
                result = getClassName();
                break;
        }
        return result;
    }

    @Override
    public void setValueAt(int column, String text) {
        switch (column) {
            case 2:
                break;
            case 3:
                String result;
                if (!TextUtils.isEmpty(fieldTypeSuffix)) {
                    result = fieldTypeSuffix + "." + text;
                } else {
                    result = text;
                }
                if (CheckUtil.getInstant().containsDeclareClassName(result)) {
                    return;
                }
                CheckUtil.getInstant().removeDeclareClassName(getQualifiedName());
                setClassName(text);
                break;
        }
    }
}