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

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

    public function getAlbums($limit, $offset, $order_by = 'year', $genre_id = null, $artist_id = null){
        $sql = "SELECT album.id, album.name, album.year, artist.name as artistName, genre.name as genreName, cover.jpeg
                FROM album
                JOIN artist ON album.artistid = artist.id
                JOIN genre ON album.genreid = genre.id
                JOIN cover ON album.coverid = cover.id";
        
        if ($genre_id) {
            $sql .= " WHERE genre.id = ?";
            $params[] = $genre_id;
        }
        
        if ($artist_id) {
            if ($genre_id) {
                $sql .= " AND artist.id = ?";
            } else {
                $sql .= " WHERE artist.id = ?";
            }
            $params[] = $artist_id;
        }

        $sql .= " ORDER BY album." . $order_by . " LIMIT ? OFFSET ?";
        $params[] = $limit;
        $params[] = $offset;

        $query = $this->db->query($sql, $params);
        return $query->result();
    }

    public function get_total_albums($genre_id = null, $artist_id = null){
        $sql = "SELECT COUNT(*) as total_albums FROM album
                JOIN genre ON album.genreid = genre.id
                JOIN artist ON album.artistid = artist.id";
        
        $params = array(); // Initialiser le tableau de paramètres
    
        if ($genre_id) {
            $sql .= " WHERE genre.id = ?";
            $params[] = $genre_id;
        }
        
        if ($artist_id) {
            if ($genre_id) {
                $sql .= " AND artist.id = ?";
            } else {
                $sql .= " WHERE artist.id = ?";
            }
            $params[] = $artist_id;
        }
    
        $query = $this->db->query($sql, $params);
        $result = $query->row();
        return $result->total_albums;
    }
    

    // Méthodes pour obtenir les genres et les artistes pour les filtres
    public function getGenres(){
        $query = $this->db->query("SELECT id, name FROM genre ORDER BY name");
        return $query->result();
    }

    public function getArtists(){
        $query = $this->db->query("SELECT id, name FROM artist ORDER BY name");
        return $query->result();
    }

    public function get_album_by_id($id){
        $query = $this->db->query(
            "SELECT album.id, album.name, album.year, artist.name as artistName, genre.name as genreName, cover.jpeg
             FROM album
             JOIN artist ON album.artistid = artist.id
             JOIN genre ON album.genreid = genre.id
             JOIN cover ON album.coverid = cover.id
             WHERE album.id = ?", array($id)
        );
        $album = $query->row();
    
        if ($album) {
            $query = $this->db->query(
                "SELECT track.id, track.diskNumber, track.number, track.duration, song.name as songName
                 FROM track
                 JOIN song ON track.songid = song.id
                 WHERE track.albumid = ?
                 ORDER BY track.diskNumber, track.number", array($id)
            );
            $album->tracks = $query->result();
        }
    
        return $album;
    }

    public function getMusiques($limit, $offset, $order_by = 'title', $order_direction = 'ASC') {
        $order_column = '';
        switch ($order_by) {
            case 'artist':
                $order_column = 'artist.name';
                break;
            case 'album':
                $order_column = 'album.name';
                break;
            case 'title':
                $order_column = 'song.name';
                break;
            default:
                $order_column = 'song.name';
                break;
        }
        
        $query = $this->db->query(
            "SELECT song.id, song.name, artist.id as artist_id, artist.name as artistName, album.name as album_name, track.albumid as album_id, cover.jpeg as cover
             FROM song
             JOIN track ON song.id = track.songid
             JOIN album ON track.albumid = album.id
             JOIN artist ON album.artistid = artist.id
             JOIN cover ON album.coverid = cover.id
             ORDER BY $order_column $order_direction
             LIMIT $limit OFFSET $offset"
        );        
        return $query->result();
    }
    

    public function get_all_songs() {
        return $this->db->get('song')->result();
    }

    public function get_all_albums() {
        return $this->db->get('album')->result();
    }

    public function get_all_artists() {
        return $this->db->get('artist')->result();
    }    
    
    public function get_songs_by_album($album_id) {
        $this->db->select('song.*');
        $this->db->from('track');
        $this->db->join('song', 'track.songid = song.id');
        $this->db->where('track.albumid', $album_id);
        return $this->db->get()->result();
    }    

    public function get_random_songs($limit) {
        $this->db->order_by('RAND()');
        $this->db->limit($limit);
        return $this->db->get('song')->result();
    }
    

    public function get_total_musiques(){
        $query = $this->db->query("SELECT COUNT(*) as total_musiques FROM song");
        $result = $query->row();
        return $result->total_musiques;
    } 

    public function getAlbumsByArtiste($artiste_id){
        $query = $this->db->query("
            SELECT album.id, album.name, album.year, artist.name as artistName, genre.name as genreName, cover.jpeg,
                   track.id as track_id, track.diskNumber, track.number, track.duration, song.name as songName
            FROM album
            JOIN artist ON album.artistid = artist.id
            JOIN genre ON album.genreid = genre.id
            JOIN cover ON album.coverid = cover.id
            JOIN track ON track.albumid = album.id
            JOIN song ON track.songid = song.id
            WHERE artist.id = ?
            ORDER BY album.id, track.diskNumber, track.number
        ", array($artiste_id));
        $result = $query->result();
    
        // Organiser les résultats par album
        $albums = array();
        foreach ($result as $row) {
            $album_id = $row->id;
            if (!isset($albums[$album_id])) {
                $albums[$album_id] = (object)array(
                    'id' => $row->id,
                    'name' => $row->name,
                    'year' => $row->year,
                    'artistName' => $row->artistName,
                    'genreName' => $row->genreName,
                    'jpeg' => $row->jpeg,
                    'tracks' => array() // Initialiser un tableau pour les pistes de l'album
                );
            }
            // Ajouter la piste à l'album correspondant
            $albums[$album_id]->tracks[] = (object)array(
                'id' => $row->track_id,
                'diskNumber' => $row->diskNumber,
                'number' => $row->number,
                'duration' => $row->duration,
                'songName' => $row->songName
            );
        }
    
        return array_values($albums); // Réorganiser les albums en utilisant des index numériques
    }   
    

    public function getMostUsedGenreByArtist($artist_id) {
        $query = $this->db->query("
            SELECT genre.name as genreName, COUNT(*) as genreCount
            FROM album
            JOIN genre ON album.genreid = genre.id
            WHERE album.artistid = ?
            GROUP BY genre.name
            ORDER BY genreCount DESC
            LIMIT 1
        ", array($artist_id));
    
        return $query->row();
    }

    public function get_songs_by_artist($artist_id) {
        $this->db->select('song.*');
        $this->db->from('track');
        $this->db->join('song', 'track.songid = song.id');
        $this->db->join('album', 'track.albumid = album.id');
        $this->db->where('album.artistid', $artist_id);
        return $this->db->get()->result();
    }
}
