<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');                                             

class Model_music extends CI_Model {
	public function __construct(){
		$this->load->database();
	}

	public function get_filtered_albums($genre = [], $artist = [], $year = [], $sort = null, $order = null) {
        $this->db->select('album.name,album.id as albumId,year,artist.name as artistName, genre.name as genreName,jpeg');
        $this->db->from('album');
        $this->db->join('genre', 'album.genreId = genre.Id');
        $this->db->join('artist', 'album.artistId = artist.Id');
		$this->db->join('cover', 'album.coverId = cover.Id');

        if (!empty($genre)) {
            $this->db->where_in('genre.name', $genre);
        }
        if (!empty($artist)) {
            $this->db->where_in('artist.name', $artist);
        }
        if (!empty($year)) {
            $this->db->where_in('album.year', $year);
        }
		if ($sort && in_array($sort, ['year', 'artistName', 'name', 'genreName'])) {
            $this->db->order_by($sort, $order);
        }
        $query = $this->db->get();
        return $query->result();
    }

    public function get_all_genres() {
        $this->db->distinct();
        $this->db->select('genreId,genre.name as genreName');
		$this->db->from('album');
        $this->db->join('genre', 'album.genreId = genre.Id');
        $query = $this->db->get();
        return $query->result();
    }

    public function get_all_artists() {
        $this->db->distinct();
        $this->db->select('artistId,artist.name as artistName');
		$this->db->from('album');
        $this->db->join('artist', 'album.artistId = artist.Id');
        $query = $this->db->get();
        return $query->result();
    }

    public function get_all_years() {
        $this->db->distinct();
        $this->db->select('year');
        $query = $this->db->get('album');
        return $query->result();
    }

	public function get_filtered_artistes($genre = [], $sort = null, $order = null) {
		$this->db->distinct();
        $this->db->select('artist.Id,artist.name, genre.name as genreName');
        $this->db->from('artist');
		$this->db->join('album', 'album.artistId = artist.Id');
        $this->db->join('genre', 'album.genreId = genre.Id');

        if (!empty($genre)) {
            $this->db->where_in('genre.name', $genre);
        }
		if ($sort && in_array($sort, ['name'])) {
            $this->db->order_by($sort, $order);
        }
        $query = $this->db->get();
        return $query->result();
    }

    public function get_all_genres_artistes() {
        $this->db->distinct();
        $this->db->select('genreId,genre.name as genreName');
		$this->db->from('artist');
		$this->db->join('album', 'album.artistId = artist.Id');
        $this->db->join('genre', 'album.genreId = genre.Id');
        $query = $this->db->get();
        return $query->result();
    }

	public function get_filtered_chansons($genre = [], $artist = [], $year = [], $album = [], $sort = null, $order = null) {
        $this->db->select('track.id as trackId, song.name,song.id,album.year,album.name as albumName, artist.name as artistName, genre.name as genreName');
        $this->db->from('song');
        $this->db->join('track', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $this->db->join('artist', 'album.artistId = artist.Id');
		$this->db->join('genre', 'genre.id = album.genreid');

        if (!empty($genre)) {
            $this->db->where_in('genre.name', $genre);
        }
        if (!empty($artist)) {
            $this->db->where_in('artist.name', $artist);
        }
        if (!empty($year)) {
            $this->db->where_in('album.year', $year);
        }
		if (!empty($album)) {
            $this->db->where_in('album.name', $album);
        }
		if ($sort && in_array($sort, ['year', 'artistName', 'name', 'albumName', 'genreName'])) {
            $this->db->order_by($sort, $order);
        }
        $query = $this->db->get();
        return $query->result();
    }
	
	public function get_filtered_sorted_chansons($genres = [], $artists = [], $years = [], $albums = [], $sort_column = 'id', $sort_order = 'asc', $limit = 100, $offset = 0) {
        $this->db->distinct('song.id');
		$this->db->select('track.id as trackId, song.name,album.year,album.name as albumName, artist.name as artistName, genre.name as genreName');
        $this->db->from('song');
		$this->db->join('track', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $this->db->join('artist', 'album.artistId = artist.Id');
		$this->db->join('genre', 'genre.id = album.genreid');

        if (!empty($genres)) {
            $this->db->where_in('genreName', $genres);
        }
        if (!empty($artists)) {
            $this->db->where_in('artistName', $artists);
        }
        if (!empty($years)) {
            $this->db->where_in('year', $years);
        }
        if (!empty($albums)) {
            $this->db->where_in('albumName', $albums);
        }
        $this->db->order_by($sort_column, $sort_order);
        $this->db->limit($limit, $offset);
        return $this->db->get()->result();
    }

	public function get_all_genres_chansons() {
        $this->db->distinct();
		$this->db->select('genreId,genre.name as genreName');
		$this->db->from('song');
        $this->db->join('track', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $this->db->join('genre', 'album.genreId = genre.Id');
        $query = $this->db->get();
        return $query->result();
    }

    public function get_all_artists_chansons() {
        $this->db->distinct();
        $this->db->select('artistId,artist.name as artistName');
		$this->db->from('song');
        $this->db->join('track', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $this->db->join('artist', 'album.artistId = artist.Id');
        $query = $this->db->get();
        return $query->result();
    }

    public function get_all_years_chansons() {
        $this->db->distinct();
        $this->db->select('year');
		$this->db->from('song');
        $this->db->join('track', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $query = $this->db->get();
        return $query->result();
    }

	public function get_all_albums_chansons() {
        $this->db->distinct();
        $this->db->select('album.Id,album.name as albumName');
		$this->db->from('song');
        $this->db->join('track', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $query = $this->db->get();
        return $query->result();
    }

	public function getSearchAlbums($nom){
		$query = $this->db->query(
			"SELECT album.name,album.id as albumId,year,artist.name as artistName, genre.name as genreName,jpeg 
			FROM album 
			JOIN artist ON album.artistid = artist.id
			JOIN genre ON genre.id = album.genreid
			JOIN cover ON cover.id = album.coverid
			WHERE album.name LIKE '$nom'
			"
		);
		//$query->result();
		if ($query->num_rows() > 0){
			return $query->result();
		}
		return $query = false;
	}

	public function getSearchArtistes($nom){
		$query = $this->db->query(
			"SELECT artist.name, artist.id
			FROM artist 
			WHERE artist.name LIKE '$nom'
			"
		);
		$query->result();
		if ($query->num_rows() > 0){
			return $query->result();
		}
		return $query = false;
	}

	public function getSearchChansons($nom){
		$query = $this->db->query(
			"SELECT track.id as trackId,song.name,song.id,album.year,album.name as albumName, artist.name as artistName, genre.name as genreName
			FROM song 
			JOIN track ON track.songId = song.id
			JOIN album ON album.id = track.albumId
			JOIN artist ON album.artistid = artist.id
			JOIN genre ON genre.id = album.genreid
			WHERE song.name LIKE '$nom'
			
			"
		);
	$query->result();
	if ($query->num_rows() > 0){
		return $query->result();
	}
	return $query = false;
	}

	public function getAlbumChoose($id) {
		$this->db->where('id', $id);
		$query = $this->db->get('album');
		$album = $query->row();
	
		// Recupere la couverture
		$this->db->where('id', $album->coverId); 
		$coverQuery = $this->db->get('cover');
		$cover = $coverQuery->row();
		$album->coverImage = $cover->jpeg;
	// Recupere le l'id de la musique a partie de l'album
		$this->db->select('songId'); 
		$this->db->where('albumId', $id);
		$songsQuery = $this->db->get('track');
		$songIds = $songsQuery->result();
	
		// Récupérer les noms des chansons à partir des songIds
		$album->songs = [];
		foreach ($songIds as $song) {
			$this->db->select('name');
			$this->db->where('id', $song->songId);
			$songQuery = $this->db->get('song');
			$songData = $songQuery->row();
			$album->songs[] = $songData->name;
		}
	
		$album->tracks = [];
		foreach ($songIds as $song) {
			$this->db->select('song.name as songName, track.duration, track.Id as trackId');
			$this->db->from('track');
			$this->db->join('song', 'track.songId = song.id');
			$this->db->where('track.songId', $song->songId);
			$trackQuery = $this->db->get();
			$trackData = $trackQuery->row();
			$album->tracks[] = $trackData;
		}
	
		$this->db->where('id', $album->artistId);
			$artistQuery = $this->db->get('artist');
			$artist = $artistQuery->row();
			$album->artist = $artist;
	
			$this->db->where('id', $album->artistId);
			$artistQuery = $this->db->get('artist');
			$artist = $artistQuery->row();
			$album->artist = $artist;
			
	
	
		return $album;
	}

	public function getAlbumsByArtistId($artistId) {
		$query = $this->db->query(
			"SELECT album.name,album.id as albumId,year,artist.name as artistName, genre.name as genreName,jpeg 
			FROM album 
			JOIN artist ON album.artistid = artist.id
			JOIN genre ON genre.id = album.genreid
			JOIN cover ON cover.id = album.coverid
			WHERE album.artistid=$artistId
			ORDER BY year
			"
		);
	return $query->result();
	}

	public function create_user($user){
		$this->db->insert("User",$user);
		return $this->db->insert_id();
	}

	public function get_user_by_email($email){
		$this->db->select("userId,usernom,userprenom,usermail,userpassword");
		$this->db->from("User");
		$this->db->where("usermail",$email);

		$query = $this->db->get();
		return $query->row();
	}

	public function getPlaylist(){
		$query = $this->db->query(
			"SELECT Playlist.name, Playlist.playlistId
			FROM Playlist 
			ORDER BY Playlist.name
			"
		);
	return $query->result();
	}

	public function getSearchPlaylist($nom){
		$query = $this->db->query(
			"SELECT Playlist.name, Playlist.playlistId
			FROM Playlist 
			WHERE Playlist.name LIKE '$nom'
			"
		);
		$query->result();
		if ($query->num_rows() > 0){
			return $query->result();
		}
		return $query = false;
	}

	public function getPlaylistIdSong($id){
		$result = $this->model_music->TrackidSonginPlaylist($id);

		$track = $result->row();
		$trackId = $track->trackId;

		$query = $this->db->query(
			"SELECT Playlist.name, Playlist.playlistId
			FROM Playlist 
			JOIN PlaylistSong ON Playlist.playlistId = PlaylistSong.playlistId
			WHERE PlaylistSong.trackId = $trackId
			ORDER BY Playlist.name
			"
		);
	return $query->result();
	}

	public function addPlayliste($playlist){
		$this->db->insert("Playlist",$playlist);
		return $this->db->insert_id();
	}

	public function AddSongtoPlaylist($idplaylist, $trackId){
		$tupple = array(
			"playlistId"=> $idplaylist,
			"trackId"=> $trackId);
		$this->db->insert("PlaylistSong",$tupple);
	}	

	public function DeleteSongtoPlaylist($idplaylist, $trackId){
		$result = $this->model_music->TrackidSonginPlaylist($trackId);

		$track = $result->row();
		$trackId = $track->trackId;

		$tupple = array(
			"playlistId"=> $idplaylist,
			"trackId"=> $trackId);
		$this->db->delete("PlaylistSong",$tupple);
	}	

	public function get_song_playlist($id){
        $this->db->select('track.id as trackId, song.name,song.id,album.year,album.name as albumName, artist.name as artistName, genre.name as genreName');
		$this->db->from('Playlist');
		$this->db->join('PlaylistSong', 'PlaylistSong.playlistId  = Playlist.playlistId');
		$this->db->join('track', 'PlaylistSong.trackId  = track.id');
        $this->db->join('song', 'track.songId  = song.id');
		$this->db->join('album', 'album.id  = track.albumId');
        $this->db->join('artist', 'album.artistId = artist.Id');
		$this->db->join('genre', 'genre.id = album.genreId');
		$this->db->where('PlaylistSong.playlistId', $id);
        $query = $this->db->get();
        return $query->result();
	}

	public function SongInPlaylist($id){
		$result = $this->model_music->TrackidSonginPlaylist($id);
		
		// Si on trouve au moins une piste de cette chanson dans la playlist, retourner true
		if ($result->num_rows() > 0) {
			return true;
		}
		return false;
	}

	public function SongInThisPlaylist($idtrack,$idplaylist){
		if (!is_array($idtrack)) {
			$idtrack = array($idtrack);
		}
	
		// Étape 1: Récupérer l'ID de la chanson à partir de l'un des IDs de piste fournis
		$this->db->select('song.id as songId');
		$this->db->from('track');
		$this->db->join('song', 'song.id = track.songId');
		$this->db->where_in('track.id', $idtrack);
		$query = $this->db->get();
		
		// Vérifier si des résultats ont été trouvés
		if ($query->num_rows() == 0) {
			return false; // Si aucun résultat trouvé, retourner false
		}
		
		// Récupérer le premier songId correspondant
		$result = $query->row();
		$songId = $result->songId;
	
		// Étape 2: Récupérer tous les IDs de pistes associés à cette chanson
		$this->db->select('track.id as trackId');
		$this->db->from('track');
		$this->db->where('track.songId', $songId);
		$query = $this->db->get();
		$trackIds = array();
		foreach ($query->result() as $track) {
			$trackIds[] = $track->trackId;
		}
	
		// Étape 3: Vérifier si l'une des pistes de cette chanson est dans la playlist
		$this->db->select('PlaylistSong.trackid as trackId');
		$this->db->from('PlaylistSong');
		$this->db->where_in('PlaylistSong.trackId', $trackIds);
		$this->db->where('PlaylistSong.playlistId',$idplaylist);
		$query = $this->db->get();
		
		// Si on trouve au moins une piste de cette chanson dans la playlist, retourner true
		if ($query->num_rows() > 0) {
			return true;
		}
		return  false;
	}

	public function TrackidSonginPlaylist($id) {
		if (!is_array($id)) {
			$id = array($id);
		}
	
		// Étape 1: Récupérer l'ID de la chanson à partir de l'un des IDs de piste fournis
		$this->db->select('song.id as songId');
		$this->db->from('track');
		$this->db->join('song', 'song.id = track.songId');
		$this->db->where_in('track.id', $id);
		$query = $this->db->get();
		
		// Vérifier si des résultats ont été trouvés
		if ($query->num_rows() == 0) {
			return false; // Si aucun résultat trouvé, retourner false
		}
		
		// Récupérer le premier songId correspondant
		$result = $query->row();
		$songId = $result->songId;
	
		// Étape 2: Récupérer tous les IDs de pistes associés à cette chanson
		$this->db->select('track.id as trackId');
		$this->db->from('track');
		$this->db->where('track.songId', $songId);
		$query = $this->db->get();
		$trackIds = array();
		foreach ($query->result() as $track) {
			$trackIds[] = $track->trackId;
		}
	
		// Étape 3: Vérifier si l'une des pistes de cette chanson est dans la playlist
		$this->db->select('PlaylistSong.trackId as trackId');
		$this->db->from('PlaylistSong');
		$this->db->where_in('PlaylistSong.trackId', $trackIds);
		$query = $this->db->get();
		return $query;
	}

	public function AddAlbumtoPlaylist($idplaylist, $albumId){
		$this->db->select('track.id as trackId');
        $this->db->from('album');
        $this->db->join('track', 'album.id = track.albumId');
		$this->db->where('album.id', $albumId);
        $query = $this->db->get();
        foreach($query->result() as $tab){
			if($this->model_music->SongInThisPlaylist($tab->trackId,$idplaylist) == false){
				$this->model_music->AddSongtoPlaylist($idplaylist,$tab->trackId);
			}
		}
	}	

	public function AddArtistestoPlaylist($idplaylist, $artisteId){
		$this->db->select('track.id as trackId');
        $this->db->from('artist');
        $this->db->join('album', 'album.artistId=artist.id');
		$this->db->join('track', 'album.id = track.albumId');
		$this->db->where('artist.id', $artisteId);
        $query = $this->db->get();
        foreach($query->result() as $tab){
			if($this->model_music->SongInThisPlaylist($tab->trackId,$idplaylist) == false){
				$this->model_music->AddSongtoPlaylist($idplaylist,$tab->trackId);
			}
		}
	}	

	public function IdPLaylistByName($nomPLaylist){
		$this->db->select('Playlist.playlistId');
		$this->db->from('Playlist');
		$this->db->where('name', $nomPLaylist);
		$query = $this->db->get();
		$result = $query->row();
		return $result->playlistId;
	}

	public function DuplicatePlaylist($idplaylist,$nomplaylist){
		$id = $this->model_music->IdPLaylistByName($nomplaylist);

		$this->db->select('PlaylistSong.trackId');
		$this->db->from('PlaylistSong');
		$this->db->where('PlaylistSong.playlistId', $idplaylist);
		$query = $this->db->get();
		foreach($query->result() as $row){
			print_r($row->trackId);
			$this->model_music->AddSongtoPlaylist($id,$row->trackId);
		}
	}

	public function DeletePlaylist($idplaylist){
		$this->db->where('playlistId',$idplaylist);
		$this->db->delete("PlaylistSong");

		$this->db->where('playlistId',$idplaylist);
		$this->db->delete("Playlist");
	}

	public function get_random_tracks($genres = [], $artists = [], $years = [], $num_tracks = 10) {
        $this->db->select('track.id as trackId');
        $this->db->from('track');
		$this->db->join('album', 'album.id  = track.albumId');
		$this->db->join('artist', 'album.artistId = artist.Id');
		$this->db->join('genre', 'genre.id = album.genreid');

        if (!empty($genres)) {
            $this->db->where_in('genre.name', $genres);
        }

        if (!empty($artists)) {
            $this->db->where_in('artist.name', $artists);
        }

        if (!empty($years)) {
            $this->db->where_in('year', $years);
        }

        $this->db->order_by('RAND()');
        $this->db->limit($num_tracks);
        $query = $this->db->get();
        return $query->result();
    }
}
