class GUI():
    def __init__(self):
        self.frame = JFrame('Phone status twitter')
        self.frame.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE
        self.asteriskLoginPanel = gui.AsteriskLoginPanel(buttonAction=self.loginToAsterisk)
        self.asteriskLoginPanel.render()
        self.frame.add(self.asteriskLoginPanel)
        self.asteriskLoginPanel.getRootPane().setDefaultButton(self.asteriskLoginPanel.login)
        self.frame.pack()
        self.frame.visible = True

    def renderTwitterLoginPanel(self):
        '''Render on the frame the login panel with the fields needed to
        authenticate with the Twitter API.'''
        self.twitterLoginPanel = JPanel(GridLayout(0,2))
        self.frame.add(self.twitterLoginPanel)
        
        self.twitterLoginPanel.setBorder(BorderFactory.createTitledBorder('Twitter account information'))

        self.twitterLoginField = extragui.EnhancedTextField('asterisk-jython', 15)
        self.twitterLoginPanel.add(JLabel('Username:'******'password', 15)
        self.twitterLoginPanel.add(JLabel('Password:'******'Log in', actionPerformed=self.loginToTwitter)
        self.twitterLoginPanel.add(self.twitterLoginButton)
        self.twitterLoginPanel.getRootPane().setDefaultButton(self.twitterLoginButton)

        self.twitterLoginStatusLabel = JLabel('Awaiting information...')
        self.twitterLoginPanel.add(self.twitterLoginStatusLabel)

    def renderMainPanel(self):
        '''Render on the frame the main panel with a status label'''
        self.mainPanel = JPanel(GridLayout(0,2))
        self.frame.add(self.mainPanel)

        self.mainPanel.setBorder(BorderFactory.createTitledBorder('Application status'))

        self.mainPanel.add(JLabel('Status:'))
        self.statusLabel = JTextField('Running...', 15)
        self.statusLabel.editable = False
        self.mainPanel.add(self.statusLabel)

    def loginToAsterisk(self, event):
        '''Execute the login procedure to the Asterisk Manager interface'''
        self.manager = PhoneStatusListener(self.asteriskLoginPanel.hostname.text, \
                                            self.asteriskLoginPanel.username.text, \
                                            self.asteriskLoginPanel.password.text, \
                                            self.asteriskLoginPanel.extension.text)
        try:
            self.manager.addStatusUpdater(self.statusUpdater)
            self.manager.start()
            self.asteriskLoginPanel.visible = False
            self.renderTwitterLoginPanel()
            self.twitterLoginField.requestFocusInWindow()
            self.frame.pack()
        except:
            self.asteriskLoginPanel.status.text = "Unable to authenticate"

    def loginToTwitter(self, event):
        '''Execute the login procedure to the Twitter platform'''
        try:
            self.twitter = twitter.Api(username=self.twitterLoginField.text, \
                                        password=self.twitterPasswordField.text)
            self.twitter.GetUser(self.twitterLoginField.text)
            self.twitterLoginPanel.visible = False
            self.renderMainPanel()
            self.frame.pack()
        except:
            self.twitterLoginStatusLabel.text = "Unable to authenticate"

    def statusUpdater(self, update):
        self.statusLabel.text = update
        self.twitter.PostUpdate(update)