#!/usr/bin/env python3

import cv2
import pygame
import pygame.font
import time
import os

HOME = os.getenv('HOME')

pygame.init() 

class Vopen():
    def __init__(self):
        self.fname = HOME+'/Downloads/video.mp4'
        self.fname = HOME+'/Downloads/video.ogv'
        self.fname = HOME+'/Downloads/bbb_sunflower_480x320.mp4'
        self.scale = 80 #%
        self.x = 0
        self.y = 0
        self.cap = None
        self.shape = [200,200]  
        self.success = 1
        self.cv2 = None
        try:
            self.cv2 = cv2
        except:
            pass

        self.im = None
        self.pos = 0
        self.buffer = []
        self.init()

    def init(self):
        print(self,"init()",self.fname)
        if not os.path.isfile(self.fname):
            print()
            print("video file does not exits !! >",self.fname)
            print()
            exit()
        self.buffer = []

        if self.cv2:
            cap = self.cv2.VideoCapture(self.fname)

            self.cap = cap
            self.success, self.img = self.cap.read()
            try:
                self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)

                #self.shape = self.img.shape[:2]
                #self.img = self.rescale_frame(self.img, percent=10)
                #self.buffer.append(self.img)
                self.pos = 0
            except:pass
            self.shape = self.img.shape[1::-1]
            for i in range(900):
                self.read()

    def read(self):
        #print(self,"read()")
        #print(self.success)
        try:
            self.success, self.img = self.cap.read()

            self.img = self.cv2.cvtColor(self.img, self.cv2.COLOR_BGR2RGB)
            self.img = self.rescale_frame(self.img, percent=self.scale)
            #self.shape = self.img.shape[:2]
            #self.img = self.rescale_frame(self.img, percent=0)
            self.shape = self.img.shape[1::-1]
        except Exception as e:
            print("exception 432",e)

    def prev(self):
        self.pos -= 1
        if self.pos < 0:
            self.pos = len(self.buffer)-1
        if self.pos >= len(self.buffer):
            self.pos = len(self.buffer)-1
        self.im = self.buffer[self.pos]

    def rescale_frame(self,frame, percent=75):
        width  = int(frame.shape[1] * percent/ 100)
        height = int(frame.shape[0] * percent/ 100)
        dim = (width, height)
        return self.cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)

    def next(self):
        #print(self,"play",time.time())
        #print(dir(self.cap))
        #print(self.cap.set.__doc__)
        #print(self.cap.grab.__doc__)
         
        self.read()
        try:
            img = self.img #self.rescale_frame(self.img, percent=30)
            self.im = pygame.image.frombuffer(img.tobytes(), self.shape, "RGB")
            self.buffer.append(self.im)
            self.pos += 1
            # wn.blit(im, (self.x, self.y))
        except AttributeError as e:
            print("except",e)
            time.sleep(1)
            self.init()

    def draw(self,wn=None):
        if self.success and wn and self.im: # is not None:
            wn.blit(self.im, (self.x, self.y))

    def overlay(self,wn=None,mode="x"):
        # overlay 
        shape = self.img.shape
        shape = [0,0,0]
        pygame.draw.rect(wn,[255,200,0],[5+self.x-3,4+self.y-1+shape[0],140,20])
        font15 = pygame.font.SysFont("freemonobold",17)
        fr = font15.render(">:{}".format(mode) ,1, (0,0,0))
        wn.blit(fr,(3+self.x,4+self.y+shape[0]))

        fr = font15.render("FRAME:{}".format(self.pos) ,1, (0,0,0))
        wn.blit(fr,(45+self.x,4+self.y+shape[0]))


v = Vopen()

shape = [300,300]
if v.shape:
    shape  = v.shape


wn = pygame.display.set_mode(v.shape,pygame.RESIZABLE)
window = wn
clock = pygame.time.Clock()
pygame.display.set_caption('LibreLight VIDEO PLAYER (BOUNCE-LOOP)')
window.fill((30,30,20))
pygame.display.update()

def grab(x=55,y=55,w=60,h=60):
    # usage
    # sub = grab()
    # window.blit(sub, (500,10))
    rect = pygame.Rect(x, y, w, h)
    sub = window.subsurface(rect)
    #pixArray = pygame.PixelArray(screen)
    crop = pygame.Surface((w,h))
    crop.blit(sub, (0,0))
    return crop


class VideoDemo():
    def __init__(self):
        pass

max_frame=0
success=1

loop = 1
run = 1
while v.success and success:
    
    window.fill((30,30,20))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            success = False

        _button = None
        if "button" in event.dict:
             _button =  event.dict["button"]

        if event.type:
            print(_button, event.type,run)

        if _button == 1:
           if event.type == 5:
               print("----")
               if run:
                   run = 0
               else:
                   run = 1

    # error message
    pygame.draw.rect(wn,[255,0,0],[18,48,100,20])
    font15 = pygame.font.SysFont("freemonobold",20)
    fr = font15.render("NO VIDEO" ,1, (0,0,0))
    wn.blit(fr,(20,50))



    d = "PAUSE"
    #v.pos 
    #v.next()
    #v.prev()
    if run:
        if loop:
            d = "PLAY"
            if max_frame < 100:
                v.next()
                max_frame+=1
            else:
                d = "REVERSE"
                #max_frame = 0
                #v.init()
                v.prev()
                if v.pos <= 0:
                    max_frame = 0
                    v.pos = len(v.buffer)-1

        else:
            v.next()
    #print(i)
    if wn:
        v.draw(wn) #,x=0,y=0)

        # overlay 
        v.overlay(wn,d)

        sub = grab()
        wn.blit(sub, (500,10))
        pygame.display.update()
    clock.tick(420)
    #clock.tick(60)

 
pygame.quit()