#!/usr/bin/env python
import os
import gtk
import gtk.gdk as gdk
import gobject
import cv2
import numpy as np
import time

from Video import Video
from Back_sub import RemoveBackground
from color_replace import Replace
from normalized import NormalizedRGB
from Tshirt import DetectShirt

from config import red
from config import green,blue
from config import yellow,pink,brown,plain,temp1,temp2,color,design

templates="templates/"
assets = os.path.join(".", "assets")
tests = os.path.join(".", "tests")
TEST_MODE = bool(int(os.environ.get('VDR_TEST', 0)))


class MainUI:
    
    def __init__(self):
        
        self.isBanner_mode=True
        self.final=None
        self.design=7
        self.color=None
        
        #Initialize systems objects
        if TEST_MODE:
            self.vid=cv2.VideoCapture(os.path.join(tests, "demo.avi"))
        self.v=Video()
	#----------------testing purpose--------------#
        
        self.back=RemoveBackground()
        self.norm=NormalizedRGB()
        
        self.replace=Replace()
        #print self.replace
        self.tshirt=DetectShirt()

        self.p_mat=np.array(np.mat([[0,0],[100,0],[100,100],[0,100]],np.float32))
        self.design_template=cv2.imread(templates+"Green.png")
        #-----------------------------------------------------
        
        self.__glade__=gtk.Builder()
        self.__ui__=self.__glade__.add_from_file(os.path.join(assets, "main_ui.glade"))
        
        self.__main_win__=self.__glade__.get_object("vdr_main")
        self.drawing_area=self.__glade__.get_object("da1")
        
        self.about=self.__glade__.get_object("abt")
        self.about.connect("clicked",self.show_abt)
        self.about_dia=self.__glade__.get_object("about_dia")
                        
        #init Drawing Area
        self.drawing_area.realize()
        self.drawing_area.set_size_request(config.width, config.height)
        #get canvas
        self.canvas=self.drawing_area.window
        
        #get GC
        self.gc=self.canvas.new_gc()
        #draw rectnagle
        #print self.canvas,self.gc
        
        self.gc.set_background(gdk.Color(0,0,0,0))
        self.gc.set_foreground(gdk.Color(255,0,0,0))
        
        #print dir(self.canvas)
        self.canvas.draw_rectangle(self.gc,False,10,10,100,200)
        self.canvas.draw_line(self.gc,10,10,100,100)
        
                        
        #decorate Mainwindows
        self.__main_win__.modify_bg(gtk.STATE_NORMAL,gtk.gdk.Color(0,0,0,0))
        self.__main_win__.modify_fg(gtk.STATE_NORMAL,gtk.gdk.Color(0,255,0,0))
        
        
        self.tview1=self.__glade__.get_object("tv1")
        self.lstore1=self.__glade__.get_object("ls1")
        self.tview2=self.__glade__.get_object("tv2")
        self.lstore2=self.__glade__.get_object("ls2")
        self.apply_btn=self.__glade__.get_object("apply")
        self.apply_btn.connect("clicked",self.change_avtar)
        
        self.lstore1.append([gtk.gdk.pixbuf_new_from_file(templates+'Red.png'),red])
        self.lstore1.append([gtk.gdk.pixbuf_new_from_file(templates+'Green.png'),green])
        self.lstore1.append([gtk.gdk.pixbuf_new_from_file(templates+'Blue.png'),blue])
        self.lstore1.append([gtk.gdk.pixbuf_new_from_file(templates+'Yellow.png'),yellow])
        self.lstore1.append([gtk.gdk.pixbuf_new_from_file(templates+'Pink.png'),pink])
        self.lstore1.append([gtk.gdk.pixbuf_new_from_file(templates+'Brown.png'),brown])
        
        self.lstore2.append([gtk.gdk.pixbuf_new_from_file(templates+'Blue.png'),plain])
        self.lstore2.append([gtk.gdk.pixbuf_new_from_file(templates+'Nike.png'),temp1])
        self.lstore2.append([gtk.gdk.pixbuf_new_from_file(templates+'Reebok.png'),temp2])
        
                
        #treeview = gtk.TreeView(self.lstore1)
        self.tview1.set_model(self.lstore1)
        self.tview2.set_model(self.lstore2)
        
        self.tview1.modify_base(gtk.STATE_NORMAL,gtk.gdk.Color(0,0,0,0))
        self.tview2.modify_base(gtk.STATE_NORMAL,gtk.gdk.Color(0,0,0,0))
        
       
        cell = gtk.CellRendererPixbuf()
        column = gtk.TreeViewColumn("Pixbuf", cell)
        column.add_attribute(cell, "pixbuf", 0)
        self.tview1.append_column(column)
        cell.set_padding(30,50)
        
        cell2=gtk.CellRendererPixbuf()
        column2 = gtk.TreeViewColumn("Pixbuf", cell2)
        column2.add_attribute(cell2, "pixbuf", 0)
        self.tview2.append_column(column2)
        cell2.set_padding(30,50)
                
               
        #self.canvas.draw_
        self.drawing_area.set_app_paintable(True)
        self.drawing_area.connect("expose-event",self.display_frame)
        
        selection_color=self.tview1.get_selection()
        selection_color.connect("changed",self.change_cloth_plain)
        
        selection_design=self.tview2.get_selection()
        selection_design.connect("changed",self.change_cloth_design)
        
        self.canvas.set_background(gtk.gdk.Color(0,0,0,0))
        
        self.__main_win__.connect("delete-event",gtk.mainquit)
        self.img=cv2.cv.LoadImage(os.path.join(assets, "Banner.png"))
        #
        
        self.__main_win__.show()
        self.__main_win__.maximize()
        
    def show_abt(self,event):
        self.about_dia.run()
        self.about_dia.hide()
        
        
    def change_avtar(self,event):
        print 'ok'
        if self.isBanner_mode:
            self.img=cv2.cv.LoadImage(os.path.join(assets, "Banner_2.png"))
            
            self.timer_id=gtk.timeout_add(20*1000,self.reset)
            self.isBanner_mode=False
            self.drawing_area.queue_draw()
    
    def reset(self):
        self.img=cv2.cv.LoadImage(templates+"Banner.png")
        
        self.isBanner_mode=True
        self.drawing_area.queue_draw()
        gtk.timeout_remove(self.timer_id)
                       
                      
    def display_frame(self,a,b):
        self.drawing_area.window.draw_rectangle(self.drawing_area.get_style().white_gc,False,0,0,799,599)
        
        if self.isBanner_mode:
            self.canvas.draw_rgb_image(self.gc,1,1,798,598,gtk.gdk.RGB_DITHER_NORMAL,self.img.tostring(),2400)
            #self.final=self.getOutput_frames()
            #self.final=cv2.cvtColor(self.final,cv2.cv.CV_BGR2RGB)
            
        elif not self.isBanner_mode:
            
            if self.final==None:
                self.final=self.getOutput_frames()
                self.final=cv2.cvtColor(self.final,cv2.cv.CV_BGR2RGB)
                self.drawing_area.queue_draw()
                return 
            else:
                self.canvas.draw_rgb_image(self.gc,1,1,798,598,gtk.gdk.RGB_DITHER_NORMAL,self.final.tostring(),2400)
                self.final=self.getOutput_frames()
                self.final=cv2.cvtColor(self.final,cv2.cv.CV_BGR2RGB)
                self.drawing_area.queue_draw()
                
            #self.canvas.draw_rgb_image(self.gc,1,1,798,598,gtk.gdk.RGB_DITHER_NORMAL,self.final.tostring(),2400)
            
        
    def getOutput_frames(self):
        # using VideoCapture for test
        
        if TEST_MODE:
            _,frame=self.vid.read() #NOTE: Testing without camera. uncomment this to feed from camera.
        else:
            frame=self.v.outFrame() #NOTE: feeding from Camera.

        self.norm.getRGB(frame) #input to Normalized RGB
               
        norm_rgb=self.norm.normalized() #normalized RGB
        print 'Got normalized RGB '       
        rgb_planes=self.v.imagePlanes(norm_rgb)
                
#-------bg subtraction part-----------
#        load background samples
        self.back.loadBackground()
        self.back.getFrames(rgb_planes[1])
        self.back.subtract_back(norm_rgb)
        
        subtracted=self.back.remove(frame)
        print 'background subtracted now'
        
        self.tshirt.getFrames(norm_rgb)
        mask,cntr=self.tshirt.detect_shirt()
        print 'found tshirt'
        
        self.replace.getFrames(subtracted,mask)
        
        res=self.replace.replace_color(self.color)
        
        if self.design is not 7:
            res=self.replace.replace_design(cntr,self.p_mat, self.design_template, res)
        
        #replace.replace_design(cntr, p_mat,design_template,res)

        #cv2.imshow("subtracted", res)
        
        return res
        
        
    def change_cloth_plain(self,selected):
        global color
        model,iter=selected.get_selected()
        color=model.get_value(iter,1)
        self.color=color
     
        
    def change_cloth_design(self,selected):
        global design
        model,iter=selected.get_selected()
        self.design=model.get_value(iter,1)
        
        if self.design==8:
            self.design_template=cv2.imread(templates+"nike.png",cv2.cv.CV_LOAD_IMAGE_UNCHANGED)
        if self.design==9:
            self.design_template=cv2.imread(templates+"Rbk.png",cv2.cv.CV_LOAD_IMAGE_UNCHANGED)
            
        
        
def sample_bg(frame):
    '''This function sample some background images for bakground subtraction.'''
    if frame==None:
            print 'Training skipped...NOTE: VDR will use already sampled background.'
    else:
        cv2.imwrite("./train/back_g.jpg",frame)        

def Main():
    
    train=False
    print 'training started'
    
    if train:
        v=Video()
        n=NormalizedRGB()
        for i in range(100):
            frm=v.outFrame()
            n.getRGB(frm)
            norm=n.normalized()
            plain=v.imagePlanes(norm)
        
            sample_bg(plain[1])
        print 'training ends...'
        del v
    
    
    m=MainUI()
    gtk.main()

if __name__=="__main__":
    Main()