/*
 * Copyright (C) 2016 Jorge Ruesga
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.ruesga.gerrit.plugins.fcm;

import static com.google.gerrit.server.account.AccountResource.ACCOUNT_KIND;
import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
import static com.ruesga.gerrit.plugins.fcm.server.DeviceResource.DEVICE_KIND;
import static com.ruesga.gerrit.plugins.fcm.server.TokenResource.TOKEN_KIND;

import com.google.gerrit.extensions.events.AssigneeChangedListener;
import com.google.gerrit.extensions.events.ChangeAbandonedListener;
import com.google.gerrit.extensions.events.ChangeMergedListener;
import com.google.gerrit.extensions.events.ChangeRestoredListener;
import com.google.gerrit.extensions.events.ChangeRevertedListener;
import com.google.gerrit.extensions.events.CommentAddedListener;
import com.google.gerrit.extensions.events.DraftPublishedListener;
import com.google.gerrit.extensions.events.HashtagsEditedListener;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.events.ReviewerAddedListener;
import com.google.gerrit.extensions.events.ReviewerDeletedListener;
import com.google.gerrit.extensions.events.RevisionCreatedListener;
import com.google.gerrit.extensions.events.TopicEditedListener;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.restapi.RestApiModule;
import com.google.inject.Scopes;
import com.ruesga.gerrit.plugins.fcm.DatabaseManager;
import com.ruesga.gerrit.plugins.fcm.handlers.AssigneeChangedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.ChangeAbandonedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.ChangeMergedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.ChangeRestoredEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.ChangeRevertedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.CommentAddedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.DraftPublishedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.HashtagsEditedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.LifeCycleHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.ReviewerAddedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.ReviewerDeletedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.RevisionCreatedEventHandler;
import com.ruesga.gerrit.plugins.fcm.handlers.TopicEditedEventHandler;
import com.ruesga.gerrit.plugins.fcm.server.DeleteToken;
import com.ruesga.gerrit.plugins.fcm.server.Devices;
import com.ruesga.gerrit.plugins.fcm.server.GetCloudNotificationsConfigInfo;
import com.ruesga.gerrit.plugins.fcm.server.GetToken;
import com.ruesga.gerrit.plugins.fcm.server.PostToken;
import com.ruesga.gerrit.plugins.fcm.server.Tokens;
import com.ruesga.gerrit.plugins.fcm.workers.FcmUploaderWorker;


public class ApiModule extends RestApiModule {

    public static final String CONFIG_ENTRY_POINT = "cloud-notifications";
    public static final String DEVICES_ENTRY_POINT = "devices";
    public static final String TOKEN_ENTRY_POINT = "tokens";

    @Override
    protected void configure() {
        bind(DatabaseManager.class).in(Scopes.SINGLETON);
        bind(Configuration.class).in(Scopes.SINGLETON);
        bind(FcmUploaderWorker.class).in(Scopes.SINGLETON);

        // Configure listener handlers
        DynamicSet.bind(binder(), LifecycleListener.class)
                .to(LifeCycleHandler.class);
        DynamicSet.bind(binder(), AssigneeChangedListener.class)
                .to(AssigneeChangedEventHandler.class);
        DynamicSet.bind(binder(), ChangeAbandonedListener.class)
                .to(ChangeAbandonedEventHandler.class);
        DynamicSet.bind(binder(), ChangeMergedListener.class)
                .to(ChangeMergedEventHandler.class);
        DynamicSet.bind(binder(), ChangeRestoredListener.class)
                .to(ChangeRestoredEventHandler.class);
        DynamicSet.bind(binder(), ChangeRevertedListener.class)
                .to(ChangeRevertedEventHandler.class);
        DynamicSet.bind(binder(), CommentAddedListener.class)
                .to(CommentAddedEventHandler.class);
        DynamicSet.bind(binder(), DraftPublishedListener.class)
                .to(DraftPublishedEventHandler.class);
        DynamicSet.bind(binder(), HashtagsEditedListener.class)
                .to(HashtagsEditedEventHandler.class);
        DynamicSet.bind(binder(), ReviewerDeletedListener.class)
                .to(ReviewerDeletedEventHandler.class);
        DynamicSet.bind(binder(), ReviewerAddedListener.class)
                .to(ReviewerAddedEventHandler.class);
        DynamicSet.bind(binder(), RevisionCreatedListener.class)
                .to(RevisionCreatedEventHandler.class);
        DynamicSet.bind(binder(), TopicEditedListener.class)
                .to(TopicEditedEventHandler.class);

        // Configure the Rest API
        DynamicMap.mapOf(binder(), DEVICE_KIND);
        DynamicMap.mapOf(binder(), TOKEN_KIND);
        get(CONFIG_KIND, CONFIG_ENTRY_POINT).to(
                GetCloudNotificationsConfigInfo.class);
        child(ACCOUNT_KIND, DEVICES_ENTRY_POINT).to(Devices.class);
        child(DEVICE_KIND, TOKEN_ENTRY_POINT).to(Tokens.class);
        get(TOKEN_KIND).to(GetToken.class);
        post(DEVICE_KIND, TOKEN_ENTRY_POINT).to(PostToken.class);
        delete(TOKEN_KIND).to(DeleteToken.class);
    }
}