import React from 'react';
import Contacts from './Contacts/index.jsx'
import Messages from './Messages/index.jsx'
import Channels from './Channels/index.jsx'
import { Tab } from 'semantic-ui-react'
import Login from './Login.jsx'
import {ctx} from './context.jsx'
import Subscriptions from './Subscriptions/index.jsx';
import Media from './Media/index.jsx';

class Root extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      identity_pubkey: null,
      balance: null,
      pending_open_balance: null,
      messages: [],
      contacts: [],
      subscriptions: [],
      chats: [],
    }
    this.getSubscriptions = this.getSubscriptions.bind(this)
  }

  componentDidMount() {
    document.title = location.hostname
    if (this.props.isLoggedIn) {
      this.getBalance()
      this.getInfo()
      this.connectSocket()
      this.getContacts()
      this.getMessages()
      this.getSubscriptions()
      this.getChats()
      this.listPayments()
      this.getLogs()
    }
  }

  connectSocket() {
    let protocol = (location.protocol == 'https:') ? 'wss' : 'ws'
    this.socket = new WebSocket(`${protocol}://${location.hostname}:${location.port}/sphinx_chat`)
    this.socket.onopen = () => {
      console.log('socket opened')
    }
    this.socket.onmessage = event => {
      const message = JSON.parse(event.data)
      console.log('received message', { message })
      const messages = [...this.state.messages, message]
      this.setState({messages})
    }
  }

  listPayments() {
    fetch('/payments').then(r => r.json()).then(body => {
      console.log("payments",body)
    })
  }

  getLogs() {
    fetch('/logs').then(r => r.json()).then(body => {
      console.log("logs",body)
    })
  }

  getBalance() {
    fetch('/balance').then(r => r.json()).then(body => {
      const { balance, pending_open_balance } = body.response
      console.log(balance)
      this.setState({ balance, pending_open_balance })
    })
  }

  getSubscriptions(){
    fetch('/subscriptions').then(r => r.json()).then(body => {
      this.setState({ subscriptions: body.response })
    })
  }

  getInfo() {
    fetch('/getinfo').then(r => r.json()).then(body => {
      console.log(body.response)
      const { identity_pubkey } = body.response
      this.setState({ identity_pubkey })
    })
  }

  getMessages() {
    fetch('/messages').then(r => r.json()).then(body => {
      this.setState({ messages: body.response.new_messages })
    })
  }

  getContacts() {
    console.log("get contacts")
    fetch('/contacts').then(r => r.json()).then(body => {
      this.setState({ contacts: body.response.contacts })
    })
  }

  getChats() {
    fetch('/chats').then(r => r.json()).then(body => {
      this.setState({ chats: body.response })
    })
  }

  render() {
    const { balance, pending_open_balance, messages, channels, identity_pubkey, contacts, chats } = this.state

    if (!this.props.isLoggedIn) {
      return <Login />
    }

    return (
      <ctx.Provider value={this.state}>
        <div className="ui container" style={{marginTop:20}}>
          <h2>Sphinx Chat</h2>

          <div style={{margin:'10px 0 20px 0'}}>
            <div>Host: {document.location.host}</div>
            <div>Identity Pubkey: {identity_pubkey}</div>
            <div>Channel balance: {balance}</div>
            <div>Pending open balance: {pending_open_balance}</div>
          </div>

          <Tab
            panes={[
              { menuItem: 'Contacts', render: () => <Tab.Pane><Contacts /></Tab.Pane> },
              { menuItem: 'Messages', render: () => <Tab.Pane><Messages /></Tab.Pane> },
              { menuItem: 'Channels', render: () => <Tab.Pane><Channels /></Tab.Pane> },
              { menuItem: 'Subscriptions', render: () => <Tab.Pane><Subscriptions getSubscriptions={this.getSubscriptions} /></Tab.Pane> },
              { menuItem: 'Media', render: () => <Tab.Pane><Media 
                contacts={contacts} chats={chats}
                identity_pubkey={identity_pubkey}
              /></Tab.Pane> },
            ]}
            renderActiveOnly={true}
          />
        </div>
      </ctx.Provider>
    )
  }
}

Root.contextType = ctx
export default Root;