package io.delphiplatform.api.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class AppArchitecture {

    /* Global */

    @Pointcut("within(io.delphiplatform.api..*)")
    public void inDelphiApi() {
    }

    @Pointcut("execution(public * *(..))")
    public void anyPublicOperation() {
    }

    @Pointcut("execution(private * *(..))")
    public void anyPrivateOperation() {
    }

    @Pointcut("anyPublicOperation() || anyPrivateOperation()")
    public void anyOperation() {
    }

    /* Common */

    @Pointcut("execution(public * io.delphiplatform.api.v3.view.util.ParamsHelper.loadAdditionalParams(..))")
    public void loadAdditionalParams() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.bigtable.RowKeyGenerator.getRangeKeySets(..))")
    public void getRangeKeySets() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.bigtable.client.DelphiBigtableClient.getRows(..))")
    public void delphiBigtableClient_getRows() {
    }

    /* Common services */

    @Pointcut("execution(public * io.delphiplatform.api.v3.bigtable.BigtableTrackPositionDataEnrichmentPublicService.*(..))")
    public void bigtableTrackPositionDataEnrichmentPublicService() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.bigtable.BigtableTrackPositionPublicManager.*(..))")
    public void bigtableTrackPositionPublicManager() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.extapi.SpotifyApiService.*(..))")
    public void spotifyApiService() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.rdb.service.playlist_public.PlaylistPublicService.findAllByPlaylistIdFiltered(..))")
    public void PlaylistPublicService_findAllByPlaylistIdFiltered() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.rdb.service.spotify.SpotifyPlaylistTrackLifetimePublicService.*(..))")
    public void spotifyPlaylistTrackLifetimePublicService() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.rdb.service.apple.music.AppleMusicPlaylistTrackLifetimePublicService.*(..))")
    public void appleMusicPlaylistTrackLifetimePublicService() {
    }

    /* API method major services */

    @Pointcut("execution(public * io.delphiplatform.api.v3.bigtable.BigtableTrackPositionPreviousPublicService.getPlaylistTrackPreviousPositionsModels(..))")
    public void bigtableTrackPositionPreviousPublicService_getPlaylistTrackPreviousPositionsModels() {
    }

    /* Other */

    @Pointcut("execution(public * io.delphiplatform.api.v3.view.TrackPositionsApiPublicController.loadAdditionalParams(..))")
    public void TrackPositionsApiPublicController_loadAdditionalParams() {
    }

    /* Pointcuts grouping */

    @Pointcut(
        "getRangeKeySets() "
        //+ "|| delphiBigtableClient_getRows() "
    )
    public void bigtableOperations() {
    }

    @Pointcut(
        "bigtableOperations() "
            + "|| loadAdditionalParams() "
            + "|| bigtableTrackPositionDataEnrichmentPublicService() "
            + "|| bigtableTrackPositionPublicManager() "
            + "|| TrackPositionsApiPublicController_loadAdditionalParams() "
    )
    public void publicTrackPositionsPlaylistsOperations() {
    }

    @Pointcut(
        "bigtableOperations() "
            + "|| loadAdditionalParams() "
            + "|| bigtableTrackPositionDataEnrichmentPublicService() "
            + "|| bigtableTrackPositionPublicManager() "
            + "|| TrackPositionsApiPublicController_loadAdditionalParams() "
    )
    public void publicTrackPositionsPlaylistsAdditionsOperations() {
    }

    @Pointcut(
        "bigtableOperations() "
            + "|| loadAdditionalParams() "
            + "|| bigtableTrackPositionPublicManager() "
            + "|| TrackPositionsApiPublicController_loadAdditionalParams() "
    )
    public void publicTrackPositionsPlaylistsSummaryOperations() {
    }

    @Pointcut(
        "loadAdditionalParams() "
            + "|| bigtableTrackPositionPreviousPublicService_getPlaylistTrackPreviousPositionsModels() "
            + "|| TrackPositionsApiPublicController_loadAdditionalParams() "
            + "|| spotifyPlaylistTrackLifetimePublicService() "
            + "|| appleMusicPlaylistTrackLifetimePublicService() "
    )
    public void publicTrackPositionsPreviousPlaylistsOperations() {
    }

    @Pointcut(
        "bigtableOperations() "
            + "|| spotifyApiService() "
            + "|| PlaylistPublicService_findAllByPlaylistIdFiltered() "
            + "|| bigtableTrackPositionDataEnrichmentPublicService() "
            + "|| bigtableTrackPositionPublicManager() "
    )
    public void publicTrackPositionsPlaylistsCurrentTracklistOperations() {
    }

    @Pointcut(
        "bigtableOperations()"
    )
    public void streamsOperations() {
    }

    @Pointcut("execution(public * io.delphiplatform.api.v3.rdb.service.TrackStreamsInsightsAggregateService.aggregate(..))")
    public void TrackStreamsInsightsAggregateService_aggregate() {
    }

    @Pointcut(
        "streamsOperations() "
            + "|| publicTrackPositionsPlaylistsOperations()"
            + "|| publicTrackPositionsPlaylistsAdditionsOperations()"
            + "|| publicTrackPositionsPlaylistsSummaryOperations()"
            + "|| publicTrackPositionsPreviousPlaylistsOperations()"
            + "|| publicTrackPositionsPlaylistsCurrentTracklistOperations()"
            + "|| TrackStreamsInsightsAggregateService_aggregate()"
    )
    public void delphiApiOperation() {
    }
}
