import { ISelfCheckTree } from "../../SelfModels/SelfCheckTree";

export interface ISpecifierCheckTreeView {
    id: number;
    isFromChild: boolean;
    isFromParent: boolean;
    code: IStructrulCodeTreeViewJson;
    multiCode?: boolean;
}

export interface IStructrulCodeFullName {
    id: number;
    code: string;
    name: string;
}

export interface IStructrulCodeTreeViewJson {
    isFromChild?: boolean;
    id: number;
    parentId: number;
    code: string;
    name: string;
    firstName?: string;
    isExpanded: boolean;
    isLoading: boolean;
    children: IStructrulCodeTreeViewJson[] | null;
    childCount: number;
    fullName?: IStructrulCodeFullName[];
    check: ISelfCheckTree;
}

export class StructrulCodeTreeViewCode {
    static deserialize(
        data: IStructrulCodeTreeViewJson,
        children: IStructrulCodeTreeViewJson[] | null
    ): StructrulCodeTreeViewCode {
        return new StructrulCodeTreeViewCode(
            data.id,
            data.parentId,
            data.code,
            data.name,
            data.isExpanded,
            data.isLoading,
            data.childCount,
            data.check ?? 0,
            children,
            data.fullName ?? [],
            data.firstName || '',
        );
    }

    public children: StructrulCodeTreeViewCode[] | null;
    constructor(
        public id: number,
        public parentId: number,
        public code: string,
        public name: string,
        public isExpanded: boolean,
        public isLoading: boolean,
        public childCount: number,
        public check: ISelfCheckTree,
        children: IStructrulCodeTreeViewJson[] | null,
        public fullName?: IStructrulCodeFullName[],
        public firstName?: string
    ) {
        if (children) {
            this.children = children.map(
                (item: IStructrulCodeTreeViewJson): StructrulCodeTreeViewCode => {
                    return StructrulCodeTreeViewCode.deserialize(item, item.children);
                }
            );
        } else {
            this.children = null;
        }
    }
}
