from PyQt5.QtMultimedia import QMediaPlaylist, QMediaContent, QMediaPlayer
from PyQt5.QtCore import Qt, QUrl

import soundfile as sf
from collections import deque
import requests
import json
from config.config import Config

SERVER_URL = Config.CLIENT_CONFIG["server_url"]
INFERENCE_STR = Config.CLIENT_CONFIG["inference_path"]

class Player:
    def __init__(self, parent):
        self.parent = parent

        self.player = QMediaPlayer()
        self.player.currentMediaChanged.connect(self.mediaChanged)
        self.player.durationChanged.connect(self.durationChanged)
        self.player.positionChanged.connect(self.positionChanged)

        self.playlist = QMediaPlaylist()

        self.playlist_data = []
        self.sound_prev_idx = 0

    def play(self, playlists, startRow=0, option=QMediaPlaylist.Sequential ):
        print(f'in player player.state = {self.player.state()}, {QMediaPlayer.PausedState}')

        if self.player.state() == QMediaPlayer.PausedState:
            self.player.play()
        else:
            self.createPlaylist(playlists, startRow, option)
            self.playlist.setCurrentIndex(startRow)
            self.player.play()
    
    def stop(self):
        self.player.stop()
    
    def createPlaylist(self, playlists, startRow=0, option=QMediaPlaylist.Sequential):
        self.playlist.clear()

        for path in playlists:
            url = QUrl.fromLocalFile(path)
            self.playlist.addMedia(QMediaContent(url))

        self.player.setPlaylist(self.playlist)
        
        self.playlist.setPlaybackMode(option)

    def upateVolume(self, vol):
        self.player.setVolume(vol)
 
    def mediaChanged(self, e):
        self.sound_prev_idx = 0
        self.parent.updateMediaChanged(self.playlist.currentIndex()) 
 
    def durationChanged(self, msec):
        if msec>0:
            self.parent.updateDurationChanged(self.playlist.currentIndex(), msec)
 
    def positionChanged(self, msec):
        if msec>0:
            self.parent.updatePositionChanged(self.playlist.currentIndex(), msec)