/*
 * Copyright 2017 Cisco Systems, Inc.
 *
 * 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.cisco.gerrit.plugins.slack.message;

import static org.apache.commons.lang3.StringUtils.substringBefore;

import com.cisco.gerrit.plugins.slack.config.ProjectConfig;
import com.google.gerrit.server.events.WorkInProgressStateChangedEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A specific MessageGenerator implementation that can generate a message for a work-in-progress
 * state changed event.
 *
 * @author James Hartig
 */
public class WorkInProgressStateChangedGenerator implements MessageGenerator {
  /** The class logger instance. */
  private static final Logger LOGGER =
      LoggerFactory.getLogger(WorkInProgressStateChangedGenerator.class);

  private ProjectConfig config;
  private WorkInProgressStateChangedEvent event;

  /**
   * Creates a new WorkInProgressStateChangedGenerator instance using the provided
   * WorkInProgressStateChangedEvent instance.
   *
   * @param event The WorkInProgressStateChangedEvent instance to generate a message for.
   */
  WorkInProgressStateChangedGenerator(WorkInProgressStateChangedEvent event, ProjectConfig config) {
    if (event == null) {
      throw new NullPointerException("event cannot be null");
    }

    this.event = event;
    this.config = config;
  }

  @Override
  public boolean shouldPublish() {
    if (!config.isEnabled() || !config.shouldPublishOnWipReady()) {
      return false;
    }

    // If the change is still work-in-progress then ignore
    if (Boolean.TRUE.equals(event.change.get().wip)) {
      return false;
    }
    return true;
  }

  @Override
  public String generate() {
    String message;
    message = "";

    try {
      MessageTemplate template;
      template = new MessageTemplate();

      template.setChannel(config.getChannel());
      template.setName(event.changer.get().name);
      template.setAction("proposed");
      template.setNumber(event.change.get().number);
      template.setProject(event.change.get().project);
      template.setBranch(event.change.get().branch);
      template.setUrl(event.change.get().url);
      template.setTitle(substringBefore(event.change.get().commitMessage, "\n"));

      message = template.render();
    } catch (Exception e) {
      LOGGER.error("Error generating message: " + e.getMessage(), e);
    }

    return message;
  }
}
