#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urwid, subprocess
from urwid import curses_display

class Conversation(object):
    def __init__(self):
        self.items = urwid.SimpleListWalker(
            [self.new_question()])
        self.listbox = urwid.ListBox(self.items)
        instruct = urwid.Text("Press F8 to exit.")
        header = urwid.AttrWrap( instruct, 'header' )
        self.top = urwid.Frame(self.listbox, header)

    def main(self):
        self.ui = urwid.curses_display.Screen()
        self.ui.register_palette([
            ('header', 'black', 'dark cyan', 'standout'),
            ('I say', 'default', 'default', 'bold'),
            ])
        self.ui.run_wrapper( self.run )
    
    def run(self):
        size = self.ui.get_cols_rows()

        while True:
            self.draw_screen( size )
            keys = self.ui.get_input()
            if "f8" in keys:
                break
            for k in keys:
                if k == "window resize":
                    size = self.ui.get_cols_rows()
                    continue
                self.keypress( size, k )

    def keypress(self, size, k):
        if k == "enter":
            widget, pos = self.listbox.get_focus()
            if not hasattr(widget,'get_edit_text'):
                return

            text = widget.get_edit_text()
            answer = self.new_answer(text)

            if text.lower().startswith('yes'):
                self.suspend(True,answer)
            else:
                self.suspend(False,answer)
        else:
            self.top.keypress( size, k )

    def suspend(self,suspend,answer):
        widget, pos = self.listbox.get_focus()
        if suspend is not False:
            self.ui.stop()
            fubar = subprocess.call("links www.google.de", shell=True)
            self.ui.start()
        if pos == len(self.items)-1:
            self.items.append( answer )
            self.items.append( self.new_question() )
        else:
            self.items[pos+1:pos+2] = [answer]
        self.listbox.set_focus( pos+2, coming_from='above' )
        widget, pos = self.listbox.get_focus()
        widget.set_edit_pos(0)

    def draw_screen(self, size):
        canvas = self.top.render( size, focus=True )
        self.ui.draw_screen( size, canvas )

    def new_question(self):
        return urwid.Edit(('I say',"Suspend? Type 'yes' :)\n"))

    def new_answer(self, name):
        return urwid.Text(('I say',"kay.\n"))

Conversation().main()