import React, { Component } from 'react'
import _ from 'lodash'
import { FlowActions } from '../../actions.js'
import { RequestUtils, isValidHttpVersion, parseUrl, parseHttpVersion } from '../../flow/utils.js'
import { Key, formatTimeStamp } from '../../utils.js'
import ContentView from '../ContentView'
import ValueEditor from '../ValueEditor'
import Headers from './Headers'
class RequestLine extends Component {
    render() {
        const { flow } = this.props
        return (
            
                 FlowActions.update(flow, { request: { method } })}
                    inline
                />
                 
                 FlowActions.update(flow, { request: Object.assign({ path: '' }, parseUrl(url)) })}
                    isValid={url => !!parseUrl(url).host}
                    inline
                />
                 
                 FlowActions.update(flow, { request: { http_version: parseHttpVersion(ver) } })}
                    isValid={isValidHttpVersion}
                    inline
                />
            
        )
    }
}
class ResponseLine extends Component {
    render() {
        const { flow } = this.props
        return (
            
                 FlowActions.update(flow, { response: { http_version: parseHttpVersion(nextVer) } })}
                    isValid={isValidHttpVersion}
                    inline
                />
                 
                 FlowActions.update(flow, { response: { code: parseInt(code) } })}
                    isValid={code => /^\d+$/.test(code)}
                    inline
                />
                 
                 FlowActions.update(flow, { response: { msg } })}
                    inline
                />
            
        )
    }
}
export class Request extends Component {
    render() {
        const { flow } = this.props
        return (
            
                
                 FlowActions.update(flow, { request: { headers } })}
                />
                
                
            
        )
    }
    edit(k) {
        switch (k) {
            case 'm':
                this.refs.requestLine.refs.method.focus()
                break
            case 'u':
                this.refs.requestLine.refs.url.focus()
                break
            case 'v':
                this.refs.requestLine.refs.httpVersion.focus()
                break
            case 'h':
                this.refs.headers.edit()
                break
            default:
                throw new Error(`Unimplemented: ${k}`)
        }
    }
}
export class Response extends Component {
    render() {
        const { flow } = this.props
        return (
            
                
                 FlowActions.update(flow, { response: { headers } })}
                />
                
                
            
        )
    }
    edit(k) {
        switch (k) {
            case 'c':
                this.refs.responseLine.refs.status_code.focus()
                break
            case 'm':
                this.refs.responseLine.refs.msg.focus()
                break
            case 'v':
                this.refs.responseLine.refs.httpVersion.focus()
                break
            case 'h':
                this.refs.headers.edit()
                break
            default:
                throw new Error(`'Unimplemented: ${k}`)
        }
    }
}
export function Error({ flow }) {
    return (
        
            
                {flow.error.msg}
                
                    {formatTimeStamp(flow.error.timestamp)}
                
             
        
    )
}