import numpy as np
import cv2
#from decimal import Decimal
import math

iWidth=1920 # pixels
iHeight=1080 # pixels
fFPS=24 # frames/second

# total 2793.576 seconds
# want 2800 seconds => 2800*24 => 67200 frames
iIdxFrameBegin=1
iIdxFrameEnd=2800*fFPS

class TheData:
  def __init__(self,straItem):
    self.strDescription=straItem[0]
    self.fSecs1=float(straItem[1])
    self.fSecs2=float(straItem[2])
    self.strBGFileName=straItem[3].strip()
    self.strFGFileName="fg"+(straItem[3].strip())[2:]
    
    # 假定由上而下
    self.fBegX1=float(straItem[4])
    self.fBegY1=float(straItem[5])
    self.fBegX2=float(straItem[6])
    self.fBegY2=float(straItem[7])
    if self.fBegX1>self.fBegX2:
      self.fBegX1,self.fBegX2=self.fBegX2,self.fBegX1
      self.fBegY1,self.fBegY2=self.fBegY2,self.fBegY1
      
    self.fEndX1=float(straItem[8])
    self.fEndY1=float(straItem[9])
    self.fEndX2=float(straItem[10])
    self.fEndY2=float(straItem[11])
    if self.fEndX1>self.fEndX2:
      self.fEndX1,self.fEndX2=self.fEndX2,self.fEndX1
      self.fEndY1,self.fEndY2=self.fEndY2,self.fEndY1
    
# 讀取檔案內容
oFile=open('data_from_excel_utf8.txt','r',encoding='UTF-8')
oContent=oFile.read()
oFile.close()

# 拿掉註解行
straSourceLine=("\n".join(("\n".join(oContent.split("\r\n"))).split("\r"))).split("\n")
straWantedLine=[]
for i in range(0,len(straSourceLine)):
  straItem=straSourceLine[i].split("\t")
  iItems=0
  for j in range(0,len(straItem)):
    if straItem[j].strip()!="":
      iItems+=1
  if iItems>=12:
    straWantedLine.append(TheData(straItem))

iMaxLenOfNum=len(str(iIdxFrameEnd)) # 數字總共幾位數
iIdxFrameBegin-=1 # base 0
iIdxFrameEnd-=1 # base 0

for iIdxFrame in range(iIdxFrameBegin,iIdxFrameEnd+1):
  
  fCurrentSeconds=(iIdxFrame+1)/fFPS
  strCurrentBGFileName=""
  strCurrentFGFileName=""
  iIdxDataBegin=-1
  iIdxDataEnd=-1
  
  # 首先尋找這個頁面的最後一筆
  for iIdxData in range(len(straWantedLine)-1,-1,-1):
    if fCurrentSeconds>=straWantedLine[iIdxData].fSecs1:
      iIdxDataEnd=iIdxData
      strCurrentBGFileName=straWantedLine[iIdxData].strBGFileName
      strCurrentFGFileName=straWantedLine[iIdxData].strFGFileName
      break
  
  # 再來尋找這個頁面的第一筆
  for iIdxData in range(iIdxDataEnd,-1,-1):
    if strCurrentBGFileName==straWantedLine[iIdxData].strBGFileName:
      iIdxDataBegin=iIdxData
    else:
      break
  
  # 繪製這個 frame
  oBG=cv2.imread('../'+strCurrentBGFileName,cv2.IMREAD_COLOR)
  oFG=cv2.imread('../'+strCurrentFGFileName,cv2.IMREAD_COLOR)
  for iIdxCB in range(iIdxDataBegin,iIdxDataEnd+1):
    if straWantedLine[iIdxCB].fSecs1==straWantedLine[iIdxCB].fSecs2:
      # 可以省略
      pass
    else:
      # 假定是由上而下
      fX=straWantedLine[iIdxCB].fBegX1
      fY=straWantedLine[iIdxCB].fBegY1
      fW=straWantedLine[iIdxCB].fBegX2-straWantedLine[iIdxCB].fBegX1
      fH=straWantedLine[iIdxCB].fEndY1-straWantedLine[iIdxCB].fBegY1
      
      if fCurrentSeconds<straWantedLine[iIdxCB].fSecs2:
        fH=fH*(fCurrentSeconds-straWantedLine[iIdxCB].fSecs1)/(straWantedLine[iIdxCB].fSecs2-straWantedLine[iIdxCB].fSecs1)
      
      x1=math.floor(fX)
      y1=math.floor(fY)
      x2=math.floor(fX+fW)
      y2=math.floor(fY+fH)
      
      oBG[y1:y2,x1:x2]=oFG[y1:y2,x1:x2]
  
  strNewFileName='frame'+str(iIdxFrame+1).zfill(iMaxLenOfNum)+'.jpg'
  cv2.imwrite('frames/'+strNewFileName, oBG, [cv2.IMWRITE_JPEG_QUALITY, 100])
  
  print("Frame "+str(iIdxFrame)+" / "+str(iIdxFrameEnd+1)+" finished.")

print("All finished!")