import RequestContext = Excel.RequestContext;
import SelectionChangedEventArgs = Excel.SelectionChangedEventArgs;
import Workbook = Excel.Workbook;

/**
 * 监听当前的格子变化，实时返回给handler
 * @param {function} handler - 回调
 * */
let eventResult: any = null

export function addMonitor(handler: Function): void {
    // 移除后添加
    removeMonitor(function () {
        Excel.run(function (ctx: RequestContext) {
            eventResult = ctx.workbook.onSelectionChanged.add(function (event: SelectionChangedEventArgs) {
                return Excel.run(function (context: RequestContext) {
                    let workbook: Workbook = context.workbook
                    let selectedRange: Excel.Range = workbook.getSelectedRange()
                    selectedRange.load('address')
                    return context.sync()
                        .then(function () {
                            handler(null, selectedRange.address, eventResult)
                            return context.sync()
                        })
                })
            })
            console.info('Event handler is running')
            return ctx.sync()
            // // 给targetAddress初始化
            // let workbook: Workbook = ctx.workbook
            // let selectedRange: Excel.Range = workbook.getSelectedRange()
            // selectedRange.load('address')

            // return ctx.sync().then(function () {
            //   handler(null, selectedRange.address, eventResult)
            //   return ctx.sync()
            // })
        })
            .catch((e: Error) => {
                handler(e)
            })
    })
}

/**
 * @param {EventResult} eventResult - 事件对象
 * @param {Function} handler - 回调函数
 * */
export function removeMonitor(handler?: Function): void {
    if (eventResult && eventResult.context) {
        Excel.run(eventResult.context, function (context) {
            eventResult.remove();
            return context.sync()
                .then(function () {
                    handler()
                    eventResult = null
                })
        }).catch(e => {
            handler(e)
        })
    } else {
        handler()
    }
}

export default {
    addMonitor,
    removeMonitor
}
