// 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.googlesource.gerrit.plugins.messageoftheday;

import static java.nio.charset.StandardCharsets.UTF_8;

import com.google.common.base.Strings;
import com.google.gerrit.extensions.annotations.PluginData;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.systemstatus.MessageOfTheDay;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;

import org.eclipse.jgit.lib.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

@Singleton
class MessageOfTheDayImpl extends MessageOfTheDay {
  private static final Logger log = LoggerFactory.getLogger(MessageOfTheDayImpl.class);

  private final File data;
  private final String id;
  private final String expiresAt;
  private final String msg;

  @Inject
  public MessageOfTheDayImpl(
      PluginConfigFactory configFactory,
      @PluginName String myName,
      @PluginData File data) {
    this.data = data;
    Config cfg = configFactory.getGlobalPluginConfig(myName);
    id = cfg.getString("message", null, "id");
    expiresAt = cfg.getString("message", null, "expiresAt");
    msg = message();
  }

  @Override
  public String getHtmlMessage() {
    if (Strings.isNullOrEmpty(id)) {
      return null;
    }

    if (Strings.isNullOrEmpty(expiresAt)) {
      log.warn("expiresAt not defined, not message will be shown");
      return null;
    }

    if (today().compareTo(expiresAt) > 0) {
      return null;
    }

    return msg;
  }

  @Override
  public String getMessageId() {
    return id;
  }

  private String message() {
    if (Strings.isNullOrEmpty(id)) {
      return null;
    }

    Path p = new File(data, id + ".html").toPath();
    try {
      return new String(Files.readAllBytes(p), UTF_8);
    } catch (IOException e) {
      log.warn("Couldn't read content of the mesage with id = " + id, e);
      return null;
    }
  }

  private static String today() {
    return new SimpleDateFormat("YYYYMMdd").format(new Date());
  }
}
