def __init__(self):
     self.connection = ConnectionSQL()
class SqlServerAccountRepository(AccountRepository):
    def __init__(self):
        self.connection = ConnectionSQL()

    def save(self, account: Account):
        self.connection.open()
        sql = """
                DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPI_CreateAccount]
                @IdAccount = ?,
                @firstName = ?,
                @lastName = ?,
                @email = ?,
                @password = ?,
                @userName = ?,
                @gender = ?,
                @birthday = ?,
                @cover = ?,
                @created = ?,
                @updated = ?,
                @contentCreator = ?,
                @typeRegister = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT

        SELECT	@salida as N'@salida',
                @estado as N'@estado'
        """
        params = (account.idAccount, account.firstName, account.lastName,
                  account.email, account.password, account.userName,
                  account.gender, account.birthday, account.cover,
                  account.createdDate, None, account.contentCreator,
                  account.typeRegister)

        self.connection.cursor.execute(sql, params)

        try:
            self.connection.save()
            print(self.connection.cursor.rowcount, " Account created")
            self.connection.close()
            return True
        except DataBaseException as ex:
            raise DataBaseException("Error en la conexión a la BD")

    def update(self, account: Account):
        self.connection.open()
        sql = """
        DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPU_UpdateAccount]
                @idAccount = ?,
                @firstName = ?,
                @lastName = ?,
                @userName = ?,
                @birthday = ?,
                @cover = ?,
                @updated = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT
        """
        params = (account.idAccount, account.firstName, account.lastName,
                  account.userName, account.birthday, account.cover,
                  account.updatedDate)

        self.connection.cursor.execute(sql, params)
        try:
            self.connection.save()
            print(self.connection.cursor.rowcount, " Accounts updated")
            self.connection.close()
            return True
        except DataBaseException as identifier:
            raise DataBaseException("Error en la conexión a la BD")

    def delete(self, accountId: str):
        self.connection.open()
        sql = """
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPD_DeleteAccount]
                    @idAccount = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT
        """
        params = (accountId)
        self.connection.cursor.execute(sql, params)
        row = self.connection.cursor.rowcount
        print(row)
        if row == -1:
            raise DataBaseException("Error deleting account")

        try:
            self.connection.save()
            self.connection.close()
            return True
        except DataBaseException as ex:
            raise DataBaseException("Error al actualizar la Base de datos: ",
                                    ex)

    def exist_account(self, idAccount: str):
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_AccountExist]
                    @idAccount = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        try:
            self.connection.open()
            self.connection.cursor.execute(sql, idAccount)
        except Exception as ex:
            raise DataBaseException("Database connection error")

        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True
        self.connection.close()
        return result

    def exist_email(self, email: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_EmailExist]
                    @email = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, email)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def exist_userName(self, userName: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_UserNameExist]
                    @userName = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, userName)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def exist_userName(self, userName: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_UserNameExist]
                    @userName = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, userName)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def login_with_username(self, username, password):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_LoginWithUsername]
                    @username = ?,
                    @password = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, username, password)
        rows = self.connection.cursor.fetchall()
        account = None
        if rows:
            for row in rows:
                account = Account(row.IdAccount, row.FirstName, row.LastName,
                                  row.Email, None, row.UserName, row.Gender,
                                  row.Birthday.strftime('%Y-%m-%d'), row.Cover,
                                  row.CreatedDate.strftime('%Y-%m-%d'), None,
                                  row.ContentCreator, None)
                if row.UpdatedDate:
                    account.updatedDate = row.UpdatedDate.strftime('%Y-%m-%d')

        self.connection.close()
        return account

    def login_with_email(self, email, password):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_LoginWithEmail]
                    @email = ?,
                    @password = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, email, password)
        rows = self.connection.cursor.fetchall()
        account = None
        if rows:
            for row in rows:
                account = Account(row.IdAccount, row.FirstName, row.LastName,
                                  row.Email, None, row.UserName, row.Gender,
                                  row.Birthday.strftime('%Y-%m-%d'), row.Cover,
                                  row.CreatedDate.strftime('%Y-%m-%d'), None,
                                  row.ContentCreator, None)
                if row.UpdatedDate:
                    account.updatedDate = row.UpdatedDate.strftime('%Y-%m-%d')

        self.connection.close()
        return account
class SqlServerArtistRepository(ArtistRepository):
    def __init__(self):
        self.connection = ConnectionSQL()

    def save(self, artist: Artist):
        try:
            self.connection.open()
            sql = """
                    DECLARE	@return_value int,
                    @salida nvarchar(1000),
                    @estado int

            EXEC	@return_value = [dbo].[SPI_CreateArtist]
                    @IdArtist = ?,
                    @Name = ?,
                    @Cover = ?,
                    @RegisterDate = ?,
                    @Description = ?,
                    @IdAccount = ?,
                    @salida = @salida OUTPUT,
                    @estado = @estado OUTPUT

            SELECT	@salida as N'@salida',
                    @estado as N'@estado'
            """
            params = (artist.idArtist, artist.name, artist.cover,
                      artist.registerDate, artist.description,
                      artist.account.idAccount)
            self.connection.cursor.execute(sql, params)
            self.connection.save()
            print(self.connection.cursor.rowcount, "Artist created")
            self.connection.close()
            return True
        except Exception as ex:
            raise DataBaseException("Data base connection error")

    def update(self, artist: Artist):
        self.connection.open()
        sql = """
        DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPU_UpdateArtist]
                @IdArtist = ?,
                @Name = ?,
                @Cover = ?,
                @Description = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT
        """
        print(artist.description)
        params = (artist.idArtist, artist.name, artist.cover,
                  artist.description)

        self.connection.cursor.execute(sql, params)
        try:
            self.connection.save()
            print(self.connection.cursor.rowcount, " Artist updated")
            self.connection.close()
            return True
        except DataBaseException as ex:
            raise DataBaseException("Database connection error" + ex)

    def delete(self, artistId: str):
        self.connection.open()
        sql = """
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPD_DeleteArtist]
                    @idArtist = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT
        """
        params = (artistId)
        self.connection.cursor.execute(sql, params)
        row = self.connection.cursor.rowcount
        print(row)
        if row == -1:
            raise DataBaseException("Error deleting artist")

        try:
            self.connection.save()
            self.connection.close()
            return True
        except DataBaseException as ex:
            raise DataBaseException("Database connection error ", ex)

    def exist_artist(self, idArtist: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_ArtistExist]
                    @IdArtist = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, idArtist)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def get_artists_like_of_account(self, idAccount: str):
        self.connection.open()
        sql = """\
            SET NOCOUNT ON;        
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)
            EXEC    @return_value = [dbo].[SPS_GetArtistsLikeOfAccount]
                    @idAccount = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
            """

        self.connection.cursor.execute(sql, idAccount)
        rows = self.connection.cursor.fetchall()
        list_artists = []
        for row in rows:
            artist = Artist(row.IdArtist, row.Name, row.Cover,
                            row.RegisterDate, row.Description)
            list_artists.append(artist)

        return list_artists

    def search_artists(self, queryCriterion):
        self.connection.open()
        sql = """     
            SELECT	* FROM Artists WHERE Name Like ? + '%'
            """

        self.connection.cursor.execute(sql, queryCriterion)
        rows = self.connection.cursor.fetchall()
        if self.connection.cursor.rowcount != 0:
            list_artists = []
            for row in rows:
                artist = Artist(row.IdArtist, row.Name, row.Cover,
                                row.RegisterDate, row.Description)
                list_artists.append(artist)
            return list_artists

        return False

    def get_account_artist(self, idAccount: str):
        try:
            self.connection.open()
            sql = """\
                DECLARE	@return_value int,
                        @estado int,
                        @salida nvarchar(1000)

                EXEC	@return_value = [dbo].[SPS_GetArtistOfAccount]
                        @idAccount = ?,
                        @estado = @estado OUTPUT,
                        @salida = @salida OUTPUT
                """
            self.connection.cursor.execute(sql, idAccount)
            row = self.connection.cursor.fetchone()
            if self.connection.cursor.rowcount != 0:
                artist = Artist(row.IdArtist, row.Name, row.Cover,
                                row.RegisterDate, row.Description)
                artist.account.idAccount = row.IdAccount
                return artist
            else:
                return None
        except Exception as ex:
            raise DataBaseException("Database connection error ", ex)
        finally:
            self.connection.close()
class SqlServerPersonalTrackRepository(PersonalTrackRepository):
    def __init__(self):
        self.connection = ConnectionSQL()

    def save(self, personalTrack:PersonalTrack):
        self.connection.open()
        sql = """
        DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPI_CreatePersonalTrack]
                @IdPersonalTrack = ?,
                @Title = ?,
                @Duration = ?,
                @FileTrack = ?,
                @Available = ?,
                @Album = ?,
                @Gender = ?,
                @IdAccount = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT
        """      
        params = (personalTrack.idPersonalTrack,personalTrack.title,personalTrack.duration,personalTrack.fileTrack,personalTrack.available,
        personalTrack.album,personalTrack.gender, personalTrack.account.idAccount)   

        try:
            self.connection.cursor.execute(sql,params)
            self.connection.save()
            if self.connection.cursor.rowcount > 0:
                print(self.connection.cursor.rowcount, "Personal track created")
                return True
            else:
                raise DataBaseException("Error in the personal Track creation")
        except Exception as ex:
            raise ex
        finally:
            self.connection.close()

    def update(self, personalTrack):
        self.connection.open()
        sql = """
        DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPU_UpdatePersonalTrack]
                @IdPersonalTrack = ?,
                @Title = ?,
                @Duration = ?,
                @FileTrack = ?,
                @Available = ?,
                @Album = ?,
                @Gender = ?,
                @IdAccount = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT
        """      
        params = (personalTrack.idPersonalTrack,personalTrack.title,personalTrack.duration,personalTrack.fileTrack,personalTrack.available,
        personalTrack.album,personalTrack.gender, personalTrack.account.idAccount)
        print(params)

        try:
            self.connection.cursor.execute(sql,params)
            self.connection.save()
            if self.connection.cursor.rowcount > 0:
                print(self.connection.cursor.rowcount, "Personal track has been updated")
                return True
            else:
                raise DataBaseException("Error in the personal Track update")
        except Exception as ex:
            raise ex
        finally:
            self.connection.close()

        
        

    def get_personal_tracks_account(self, idAccount):
        self.connection.open()
        sql = """
        SELECT * FROM PersonalTracks 
        WHERE IdAccount = ?
        """
        try:  
            self.connection.cursor.execute(sql, idAccount)
            list_personaltracks = []
            rows = self.connection.cursor.fetchall()
            for row in rows:   
                personal_track = PersonalTrack(row.IdPersonalTrack,row.Title, row.Gender,
                row.Album, row.Duration,row.FileTrack, row.Available)
                personal_track.account.idAccount = row.IdAccount
                list_personaltracks.append(personal_track)
            return list_personaltracks      
        except Exception as ex:
            print(ex)
            return ex
        finally:
            self.connection.close()
class SqlServerAlbumRepository(AlbumRepository):
    def __init__(self):
        self.connection = ConnectionSQL()

    def save(self, album: Album):
        self.connection.open()
        sql = """
                DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPI_CreateAlbum]
                @IdAlbum = ?,
                @Title = ?,
                @Cover = ?,
                @Publication = ?,
                @RecordCompany = ?,
                @IdMusicGender = ?,
                @IdAlbumType = ?,
                @IdArtist = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT

        SELECT	@salida as N'@salida',
                @estado as N'@estado'
        """

        params = (album.idAlbum, album.title, album.cover, album.publication,
                  album.recordCompany, album.musicGender.idMusicGender,
                  album.idAlbumType, album.artist.idArtist)
        self.connection.cursor.execute(sql, params)
        print("Album creado")

        try:
            self.connection.save()
            print(self.connection.cursor.rowcount, "Album created")
            self.connection.close()
            return True
        except DataBaseException as ex:
            print(str(ex))
            raise DataBaseException("Database error")

    def exists_album_gender(self, idAlbumGender: str):
        self.connection.open()

        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_AlbumGenderExists]
                    @idMusicGender = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, idAlbumGender)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def exists_album_type(self, idAlbumType: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_AlbumTypeExist]
                    @idAlbumType = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, idAlbumType)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def exists_album(self, idAlbum: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_AlbumExists]
                    @IdAlbum = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, idAlbum)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def get_albums_of_artist(self, idArtist: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_GetAlbumsOfArtist]
                    @IdArtist = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, idArtist)
        rows = self.connection.cursor.fetchall()
        list_albums = []
        for row in rows:
            album = Album(row.IdAlbum, row.Title, row.AlbumCover,
                          row.Publication, row.RecordCompany, row.IdAlbumType)
            album.artist.idArtist = row.IdArtist
            album.artist.name = row.ArtistName
            album.artist.registerDate = row.RegisterDate
            album.artist.description = row.Description
            album.artist.cover = row.ArtistCover
            album.musicGender.idMusicGender = row.IdMusicGender
            album.musicGender.genderName = row.GenderName

            list_albums.append(album)

        return list_albums

    def get_albums_like_of_account(self, idAccount: str):
        sql = """\
        SET NOCOUNT ON;    
        DECLARE	@return_value int,
                @estado int,
                @salida nvarchar(1000)
         EXEC    @return_value = [dbo].[SPS_GetAlbumsLikeOfAccount]
                @idAccount = ?,
                @estado = @estado OUTPUT,
                @salida = @salida OUTPUT

        SELECT	@estado as N'@estado',
                @salida as N'@salida'
        """
        try:
            self.connection.open()
            self.connection.cursor.execute(sql, idAccount)
            pass
        except DataBaseException as ex:
            raise ("Database connection error")
        rows = self.connection.cursor.fetchall()
        list_albums = []
        for row in rows:
            album = Album(row.IdAlbum, row.Title, row.Cover, row.Publication,
                          row.RecordCompany, row.IdAlbumType)
            album.musicGender.idMusicGender = row.IdMusicGender
            album.musicGender.genderName = row.GenderName
            album.artist.name = row.ArtistName
            album.artist.cover = row.ArtistCover
            album.artist.description = row.Description
            album.artist.registerDate = row.RegisterDate
            album.artist.idArtist = row.IdArtist
            list_albums.append(album)

        return list_albums

    def update(self, album: Album):
        pass

    def delete(self, idAlbum: str):
        pass

    def search_albums(self, queryCriterion):
        self.connection.open()
        sql = """\

         EXEC   [dbo].[SPS_SearchAlbums]
                @queryCriterion = ?
        """
        self.connection.cursor.execute(sql, queryCriterion)
        rows = self.connection.cursor.fetchall()
        if self.connection.cursor.rowcount != 0:
            list_albums = []
            for row in rows:
                album = Album(row.IdAlbum, row.Title, row.AlbumCover,
                              row.Publication, row.RecordCompany,
                              row.IdAlbumType)
                album.musicGender.idMusicGender = row.IdMusicGender
                album.musicGender.genderName = row.GenderName
                album.artist.name = row.ArtistName
                album.artist.cover = row.ArtistCover
                album.artist.description = row.Description
                album.artist.registerDate = row.RegisterDate
                album.artist.idArtist = row.IdArtist
                list_albums.append(album)
            return list_albums

        return False
class SqlServerTrackRepository(TrackRepository):
    def __init__(self):
        self.connection = ConnectionSQL()

    def save(self, track: Track):
        self.connection.open()
        sql = """
        DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPI_CreateTrack]
                @IdTrack = ?,
                @Title = ?,
                @Duration = ?,
                @Reproduction = ?,
                @FileTrack = ?,
                @avaible = ?,
                @IdAlbum = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT
        """
        params = (track.idTrack, track.title, track.duration,
                  track.reproductions, track.fileTrack, track.avaible,
                  track.album.idAlbum)
        print(params)
        self.connection.cursor.execute(sql, params)
        try:
            self.connection.save()
            if self.connection.cursor.rowcount > 0:
                print(self.connection.cursor.rowcount, "Track created")
                return True
            else:
                raise DataBaseException("Error in the Track creation")
        except Exception as ex:
            print(ex)
            raise DataBaseException("Data base connection error")
        finally:
            self.connection.close()

    def update(self, track: Track):
        self.connection.open()
        sql = """
        DECLARE	@return_value int,
                @salida nvarchar(1000),
                @estado int

        EXEC	@return_value = [dbo].[SPU_UpdateTrack]
                @idTrack = ?,
                @title = ?,
                @duration = ?,
                @reproductions = ?,
                @fileTrack = ?,
                @avaible = ?,
                @idAlbum = ?,
                @salida = @salida OUTPUT,
                @estado = @estado OUTPUT
        """
        params = (track.idTrack, track.title, track.duration,
                  track.reproductions, track.fileTrack, track.avaible,
                  track.album.idAlbum)
        print(params)
        try:
            self.connection.cursor.execute(sql, params)

            self.connection.save()
            print(self.connection.cursor.rowcount, " Track updated")
            self.connection.close()

            return True
        except Exception as ex:

            raise ex

    def delete(self, idTrack: str):
        pass

    def exists_track(self, idTrack: str):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_TrackExists]
                    @IdTrack = ?,
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
        """
        self.connection.cursor.execute(sql, idTrack)
        row = self.connection.cursor.fetchval()
        result = False
        if row == -1:
            result = False
        else:
            result = True

        self.connection.close()
        return result

    def get_tracks_of_playlist(self, idPlaylist: int):
        self.connection.open()
        sql = """
            DECLARE	@return_value int

            EXEC	@return_value = [dbo].[SPS_GetTracksOfPlaylist]
                    @idPlaylist = ?
        """
        self.connection.cursor.execute(sql, idPlaylist)
        rows = self.connection.cursor.fetchall()
        listTracks = []
        for row in rows:
            track = Track(row.IdTrack, row.TitleTrack, row.Duration,
                          row.Reproductions, row.FileTrack, row.Avaible)
            track.album.idAlbum = row.IdAlbum
            track.album.title = row.TitleAlbum
            track.album.cover = row.CoverAlbum
            track.album.publication = row.Publication
            track.album.recordCompany = row.RecordCompany
            track.album.idAlbumType = row.IdAlbumType
            track.album.artist.idArtist = row.IdArtist
            track.album.artist.name = row.Name
            track.album.artist.cover = row.CoverArtist
            track.album.artist.registerDate = row.RegisterDate
            track.album.artist.description = row.Description
            track.album.musicGender.idMusicGender = row.IdMusicGender
            track.album.musicGender.genderName = row.GenderName
            listTracks.append(track)

        self.connection.close()
        return listTracks

    def get_track(self, idTrack: str):
        self.connection.open()
        sql = "Select * FROM Tracks WHERE IdTrack = ?"
        try:
            self.connection.cursor.execute(sql, idTrack)
            row = self.connection.cursor.fetchone()
            return Track(row.IdTrack, row.Title, row.Duration,
                         row.Reproductions, row.FileTrack, row.Avaible)
        except Exception as ex:
            raise DataBaseException("Data base connection error")
        finally:
            self.connection.close()

    def search_tracks(self, queryCriterion: str):
        self.connection.open()
        sql = """\

            EXEC   [dbo].[SPS_SearchTracks]
                    @queryCriterion = ?
            """
        self.connection.cursor.execute(sql, queryCriterion)
        rows = self.connection.cursor.fetchall()
        listTracks = []
        if self.connection.cursor.rowcount != 0:
            for row in rows:

                track = Track(row.IdTrack, row.Title, row.Duration,
                              row.Reproductions, row.FileTrack, row.Avaible)
                track.album.idAlbum = row.IdAlbum
                track.album.title = row.AlbumTitle
                track.album.cover = row.Cover
                track.album.publication = row.Publication
                track.album.recordCompany = row.RecordCompany
                track.album.idAlbumType = row.IdAlbumType
                track.album.artist.idArtist = row.IdArtist
                track.album.artist.name = row.ArtistName
                track.album.artist.registerDate = row.RegisterDate
                track.album.artist.description = row.Description
                track.album.musicGender.idMusicGender = row.IdMusicGender
                track.album.musicGender.genderName = row.GenderName

                listTracks.append(track)
            return listTracks
        return False

    def get_tracks_radio_gender(self, idMusicGender: int):
        try:
            self.connection.open()
            sql = """\
                DECLARE	@return_value int

                EXEC	@return_value = [dbo].[SPS_GetRadioByGender]
                        @IdMusicGender = ?
                """
            self.connection.cursor.execute(sql, idMusicGender)
            rows = self.connection.cursor.fetchall()
            listTracks = []
            if self.connection.cursor.rowcount != 0:
                for row in rows:
                    track = Track(row.IdTrack, row.TrackTitle, row.Duration,
                                  row.Reproductions, row.FileTrack,
                                  row.Avaible)
                    track.album.idAlbum = row.IdAlbum
                    track.album.title = row.AlbumTitle
                    track.album.cover = row.AlbumCover
                    track.album.publication = row.Publication
                    track.album.recordCompany = row.RecordCompany
                    track.album.idAlbumType = row.IdAlbumType
                    track.album.artist.idArtist = row.IdArtist
                    track.album.artist.name = row.ArtistName
                    track.album.artist.cover = row.ArtistCover
                    track.album.artist.registerDate = row.RegisterDate
                    track.album.artist.description = row.Description
                    track.album.musicGender.idMusicGender = row.IdMusicGender
                    track.album.musicGender.genderName = row.GenderName

                    listTracks.append(track)

            return listTracks
        except Exception as ex:
            print(ex)
            raise DataBaseException("Database connection error")
        finally:
            self.connection.close()

    def add_track_played(self, idTrack, reproductionDate, idAccount):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPI_AddTrackToHistory]
                    @idAccount = ?,
                    @idTrack = ?,                    
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
            """

        try:
            params = (idAccount, idTrack)
            print(params)
            self.connection.cursor.execute(sql, params)
            self.connection.save()
            self.connection.close()
            return True
        except Exception as ex:
            raise ex

    def get_tracks_account_history(self, idAccount):
        self.connection.open()
        sql = """\
            DECLARE	@return_value int,
                    @estado int,
                    @salida nvarchar(1000)

            EXEC	@return_value = [dbo].[SPS_GetTracksHistoryAccount]
                    @idAccount = ?,                  
                    @estado = @estado OUTPUT,
                    @salida = @salida OUTPUT

            SELECT	@estado as N'@estado',
                    @salida as N'@salida'
            """

        try:
            self.connection.cursor.execute(sql, idAccount)
            rows = self.connection.cursor.fetchall()
            list_tracks = []

            if self.connection.cursor.rowcount != 0:
                for row in rows:
                    track = Track(row.IdTrack, row.Title, row.Duration,
                                  row.Reproductions, row.FileTrack,
                                  row.Avaible)
                    track.album.idAlbum = row.IdAlbum
                    track.album.title = row.AlbumTitle
                    track.album.cover = row.Cover
                    track.album.publication = row.Publication
                    track.album.recordCompany = row.RecordCompany
                    track.album.idAlbumType = row.IdAlbumType
                    track.album.artist.idArtist = row.IdArtist
                    track.album.artist.name = row.ArtistName
                    track.album.artist.registerDate = row.RegisterDate
                    track.album.artist.description = row.Description
                    track.album.musicGender.idMusicGender = row.IdMusicGender
                    track.album.musicGender.genderName = row.GenderName
                    list_tracks.append(track)
                return list_tracks

        except Exception as ex:
            print(ex)
            raise DataBaseException("Database connection error")
        finally:
            self.connection.close()

    def get_tracks_of_album(self, idAlbum: str):
        self.connection.open()
        sql = """\
        DECLARE	@return_value int,
                @estado int,
                @salida nvarchar(1000)

        EXEC    @return_value = [dbo].[SPS_GetTracksOfAlbum]
                @idAlbum = ?,
                @estado = @estado OUTPUT,
                @salida = @salida OUTPUT

        SELECT	@estado as N'@estado',
                @salida as N'@salida'
        """

        try:
            self.connection.cursor.execute(sql, idAlbum)
            list_tracks = []
            rows = self.connection.cursor.fetchall()
            for row in rows:
                track = Track(row.IdTrack, row.Title, row.Duration,
                              row.Reproductions, row.FileTrack, row.Avaible)
                track.album.idAlbum = row.IdAlbum
                track.album.title = row.AlbumTitle
                track.album.cover = row.Cover
                track.album.publication = row.Publication
                track.album.recordCompany = row.RecordCompany
                track.album.idAlbumType = row.IdAlbumType
                track.album.artist.idArtist = row.IdArtist
                track.album.artist.name = row.ArtistName
                track.album.artist.registerDate = row.RegisterDate
                track.album.artist.description = row.Description
                track.album.musicGender.idMusicGender = row.IdMusicGender
                track.album.musicGender.genderName = row.GenderName
                list_tracks.append(track)
            return list_tracks
            list_tracks.append(track)

            return list_tracks
        except Exception as ex:
            return DataBaseException("Database connection error")
        finally:
            self.connection.close()