export interface NavDataElement {

    /**
     * 视图标题
     *
     * @memberof NavDataElement
     */
    title: any;

    /**
     * 视图数据
     *
     * @memberof NavDataElement
     */
    data: any;

    /**
     * 视图路径
     *
     * @memberof NavDataElement
     */
    path: string;

    /**
     * 视图打开模式（路由为true，非路由为false）
     *
     * @memberof NavDataElement
     */
    viewmode: boolean;

    /**
     * 视图类型
     *
     * @memberof NavDataElement
     */
    viewType: string;

    /**
     * 视图标识
     *
     * @memberof NavDataElement
     */
    tag: string;

    /**
     * 数据标识
     *
     * @memberof NavDataElement
     */
    key: any;
}

export interface ServiceState {

    /**
     * 行为
     *
     * @memberof ServiceState
     */
    action: string;

    /**
     * 名称
     *
     * @memberof ServiceState
     */
    name: any;

    /**
     * 数据
     *
     * @memberof ServiceState
     */
    data: any;

}

import { Subject } from 'rxjs';

/**
 * 导航数据服务
 * 
 * @export
 * @class CodeListService
 */
export class NavDataService {

    /**
     * 单例变量声明
     *
     * @private
     * @static
     * @type {NavDataService}
     * @memberof NavDataService
     */
    private static navDataService: NavDataService;

    /**
     * 服务状态
     * 
     * @memberof NavDataService
     */
    public serviceState: Subject<ServiceState> = new Subject();

    /**
     * 导航数据栈
     * 
     * @memberof NavDataService
     */
    public navDataStack: Array<NavDataElement> = [];

    /**
     * 初始化实例
     * 
     * @memberof NavDataService
     */
    constructor(opts: any = {}) { }

    /**
     * 获取 NavDataService 单例对象
     *
     * @static
     * @returns {NavDataService}
     * @memberof NavDataService
     */
    public static getInstance(store: any): NavDataService {
        if (!NavDataService.navDataService) {
            NavDataService.navDataService = new NavDataService();
        }
        return this.navDataService;
    }

    /**
     * 添加基础导航数据到栈中
     * 
     * @memberof NavDataService
     */
    public addNavData(curNavData: NavDataElement) {
        this.navDataStack.push(curNavData);
    }

    /**
     * 设置指定数据到基础导航数据栈中
     * 
     * @memberof NavDataService
     */
    public setNavDataByTag(tag: string, isSingleMode: boolean, data: any) {
        if (this.navDataStack.length > 0) {
            let tempIndex: number = this.navDataStack.findIndex((element: NavDataElement) => {
                return Object.is(element.tag, tag);
            })
            if(this.navDataStack[tempIndex]){
                this.navDataStack[tempIndex].data = data;
                if (isSingleMode && data.srfkey && data.srfmajortext) {
                    this.navDataStack[tempIndex].key = data.srfkey;
                    this.navDataStack[tempIndex].title = data.srfmajortext;
                }
                return this.navDataStack[tempIndex];
            }else{
                return null;
            }
        } else {
            return null;
        }
    }

    /**
     * 获取基础导航数据
     * 
     * @memberof NavDataService
     */
    public getNavData() {
        return this.navDataStack;
    }

    /**
     * 从导航数据栈中获取指定数据的前一条数据
     * 
     * @memberof NavDataService
     */
    public getPreNavData(tag: string) {
        if (this.navDataStack.length > 0) {
            let tempIndex: number = this.navDataStack.findIndex((element: NavDataElement) => {
                return Object.is(element.tag, tag);
            })
            return this.navDataStack[tempIndex - 1];
        } else {
            return null;
        }
    }

    /**
     * 跳转到导航数据栈中指定数据
     * 
     * @memberof NavDataService
     */
     public skipNavData(tag: string) {
      if ((this.navDataStack.length > 0) && tag) {
          let tempIndex: number = this.navDataStack.findIndex((element: NavDataElement) => {
              return Object.is(element.tag, tag);
          })
          if (tempIndex !== -1) {
              this.navDataStack = this.navDataStack.slice(0, tempIndex + 1);
          }
      }
    }

    /**
     * 从导航数据栈中指定数据
     * 
     * @memberof NavDataService
     */
    public removeNavData(tag: string) {
        if ((this.navDataStack.length > 0) && tag) {
            let tempIndex: number = this.navDataStack.findIndex((element: NavDataElement) => {
                return Object.is(element.tag, tag);
            })
            if (tempIndex !== -1) {
                this.navDataStack = this.navDataStack.slice(0, tempIndex);
            }
        }
    }

    /**
     * 从导航数据栈中删除仅剩第一条数据
     * 
     * @memberof NavDataService
     */
    public removeNavDataFrist() {
        if (this.navDataStack.length > 0) {
            this.navDataStack = this.navDataStack.slice(0, 1);
        }
    }

    /**
     * 从导航数据栈中删除最后一条数据
     * 
     * @memberof NavDataService
     */
    public removeNavDataLast() {
        if (this.navDataStack.length > 0) {
            this.navDataStack.pop();
        }
    }

    /**
     * 从导航数据栈中删除所有数据
     * 
     * @memberof NavDataService
     */
    public removeAllNavData() {
        this.navDataStack = [];
    }

}