// Copyright (C) 2016 The Android Open Source Project
//
// 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.google.gerrit.reviewdb.server;

import com.google.common.util.concurrent.CheckedFuture;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet;

public class DisallowReadFromChangesReviewDbWrapper extends ReviewDbWrapper {
  private static final String MSG = "This table has been migrated to NoteDb";

  private final Changes changes;
  private final PatchSetApprovals patchSetApprovals;
  private final ChangeMessages changeMessages;
  private final PatchSets patchSets;
  private final PatchLineComments patchComments;

  public DisallowReadFromChangesReviewDbWrapper(ReviewDb db) {
    super(db);
    changes = new Changes(delegate.changes());
    patchSetApprovals = new PatchSetApprovals(delegate.patchSetApprovals());
    changeMessages = new ChangeMessages(delegate.changeMessages());
    patchSets = new PatchSets(delegate.patchSets());
    patchComments = new PatchLineComments(delegate.patchComments());
  }

  public ReviewDb unsafeGetDelegate() {
    return delegate;
  }

  @Override
  public ChangeAccess changes() {
    return changes;
  }

  @Override
  public PatchSetApprovalAccess patchSetApprovals() {
    return patchSetApprovals;
  }

  @Override
  public ChangeMessageAccess changeMessages() {
    return changeMessages;
  }

  @Override
  public PatchSetAccess patchSets() {
    return patchSets;
  }

  @Override
  public PatchLineCommentAccess patchComments() {
    return patchComments;
  }

  private static class Changes extends ChangeAccessWrapper {

    protected Changes(ChangeAccess delegate) {
      super(delegate);
    }

    @Override
    public ResultSet<Change> iterateAllEntities() {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public CheckedFuture<Change, OrmException> getAsync(Change.Id key) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<Change> get(Iterable<Change.Id> keys) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public Change get(Change.Id id) throws OrmException {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<Change> all() throws OrmException {
      throw new UnsupportedOperationException(MSG);
    }
  }

  private static class PatchSetApprovals extends PatchSetApprovalAccessWrapper {
    PatchSetApprovals(PatchSetApprovalAccess delegate) {
      super(delegate);
    }

    @Override
    public ResultSet<PatchSetApproval> iterateAllEntities() {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public CheckedFuture<PatchSetApproval, OrmException> getAsync(PatchSetApproval.Key key) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchSetApproval> get(Iterable<PatchSetApproval.Key> keys) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public PatchSetApproval get(PatchSetApproval.Key key) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchSetApproval> byChange(Change.Id id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchSetApproval> byPatchSet(PatchSet.Id id) {
      throw new UnsupportedOperationException(MSG);
    }
  }

  private static class ChangeMessages extends ChangeMessageAccessWrapper {
    ChangeMessages(ChangeMessageAccess delegate) {
      super(delegate);
    }

    @Override
    public ResultSet<ChangeMessage> iterateAllEntities() {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public CheckedFuture<ChangeMessage, OrmException> getAsync(ChangeMessage.Key key) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<ChangeMessage> get(Iterable<ChangeMessage.Key> keys) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ChangeMessage get(ChangeMessage.Key id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<ChangeMessage> byChange(Change.Id id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<ChangeMessage> byPatchSet(PatchSet.Id id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<ChangeMessage> all() {
      throw new UnsupportedOperationException(MSG);
    }
  }

  private static class PatchSets extends PatchSetAccessWrapper {
    PatchSets(PatchSetAccess delegate) {
      super(delegate);
    }

    @Override
    public ResultSet<PatchSet> iterateAllEntities() {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public CheckedFuture<PatchSet, OrmException> getAsync(PatchSet.Id key) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchSet> get(Iterable<PatchSet.Id> keys) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public PatchSet get(PatchSet.Id id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchSet> byChange(Change.Id id) {
      throw new UnsupportedOperationException(MSG);
    }
  }

  private static class PatchLineComments extends PatchLineCommentAccessWrapper {
    PatchLineComments(PatchLineCommentAccess delegate) {
      super(delegate);
    }

    @Override
    public ResultSet<PatchLineComment> iterateAllEntities() {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public CheckedFuture<PatchLineComment, OrmException> getAsync(PatchLineComment.Key key) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> get(Iterable<PatchLineComment.Key> keys) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public PatchLineComment get(PatchLineComment.Key id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> byChange(Change.Id id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> byPatchSet(PatchSet.Id id) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> publishedByChangeFile(Change.Id id, String file) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> publishedByPatchSet(PatchSet.Id patchset) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> draftByPatchSetAuthor(
        PatchSet.Id patchset, Account.Id author) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> draftByChangeFileAuthor(
        Change.Id id, String file, Account.Id author) {
      throw new UnsupportedOperationException(MSG);
    }

    @Override
    public ResultSet<PatchLineComment> draftByAuthor(Account.Id author) {
      throw new UnsupportedOperationException(MSG);
    }
  }
}
