import React, { Component } from 'react'
import PropTypes from 'prop-types'
import ReactDOM from 'react-dom'
import ValueEditor from '../ValueEditor/ValueEditor'
import { Key } from '../../utils'
export class HeaderEditor extends Component {
    constructor(props) {
        super(props)
        this.onKeyDown = this.onKeyDown.bind(this)
    }
    render() {
        let { onTab, ...props } = this.props
        return 
    }
    focus() {
        ReactDOM.findDOMNode(this).focus()
    }
    onKeyDown(e) {
        switch (e.keyCode) {
            case Key.BACKSPACE:
                var s = window.getSelection().getRangeAt(0)
                if (s.startOffset === 0 && s.endOffset === 0) {
                    this.props.onRemove(e)
                }
                break
            case Key.ENTER:
            case Key.TAB:
                if (!e.shiftKey) {
                    this.props.onTab(e)
                }
                break
        }
    }
}
export default class Headers extends Component {
    static propTypes = {
        onChange: PropTypes.func.isRequired,
        message: PropTypes.object.isRequired,
    }
    onChange(row, col, val) {
        const nextHeaders = _.cloneDeep(this.props.message.headers)
        nextHeaders[row][col] = val
        if (!nextHeaders[row][0] && !nextHeaders[row][1]) {
            // do not delete last row
            if (nextHeaders.length === 1) {
                nextHeaders[0][0] = 'Name'
                nextHeaders[0][1] = 'Value'
            } else {
                nextHeaders.splice(row, 1)
                // manually move selection target if this has been the last row.
                if (row === nextHeaders.length) {
                    this._nextSel = `${row - 1}-value`
                }
            }
        }
        this.props.onChange(nextHeaders)
    }
    edit() {
        this.refs['0-key'].focus()
    }
    onTab(row, col, e) {
        const headers = this.props.message.headers
        if (col === 0) {
            this._nextSel = `${row}-value`
            return
        }
        if (row !== headers.length - 1) {
            this._nextSel = `${row + 1}-key`
            return
        }
        e.preventDefault()
        const nextHeaders = _.cloneDeep(this.props.message.headers)
        nextHeaders.push(['Name', 'Value'])
        this.props.onChange(nextHeaders)
        this._nextSel = `${row + 1}-key`
    }
    componentDidUpdate() {
        if (this._nextSel && this.refs[this._nextSel]) {
            this.refs[this._nextSel].focus()
            this._nextSel = undefined
        }
    }
    onRemove(row, col, e) {
        if (col === 1) {
            e.preventDefault()
            this.refs[`${row}-key`].focus()
        } else if (row > 0) {
            e.preventDefault()
            this.refs[`${row - 1}-value`].focus()
        }
    }
    render() {
        const { message, readonly } = this.props
        return (
            
                
                {message.headers.map((header, i) => (
                    
                        | this.onChange(i, 0, val)}
                                onRemove={event => this.onRemove(i, 0, event)}
                                onTab={event => this.onTab(i, 0, event)}
                            />
                            : | this.onChange(i, 1, val)}
                                onRemove={event => this.onRemove(i, 1, event)}
                                onTab={event => this.onTab(i, 1, event)}
                            /> | 
                ))}
                
            
        )
    }
}