/*
 * Copyright 2022 The IdeaVim authors
 *
 * Use of this source code is governed by an MIT-style
 * license that can be found in the LICENSE.txt file or at
 * https://opensource.org/licenses/MIT.
 */

package com.maddyhome.idea.vim.group;

import com.intellij.openapi.diagnostic.Logger;
import com.maddyhome.idea.vim.api.VimDigraphGroupBase;
import com.maddyhome.idea.vim.api.VimEditor;
import com.maddyhome.idea.vim.ex.ExOutputModel;
import com.maddyhome.idea.vim.helper.EditorHelper;
import com.maddyhome.idea.vim.newapi.IjVimEditor;
import org.jetbrains.annotations.NotNull;

public class DigraphGroup extends VimDigraphGroupBase {

  public void showDigraphs(@NotNull VimEditor editor) {
    int width = EditorHelper.getApproximateScreenWidth(((IjVimEditor) editor).getEditor());
    if (width < 10) {
      width = 80;
    }
    int colCount = width / 12;
    int height = (int)Math.ceil((double) getDigraphs().size() / (double)colCount);

    if (logger.isDebugEnabled()) {
      logger.debug("width=" + width);
      logger.debug("colCount=" + colCount);
      logger.debug("height=" + height);
    }

    StringBuilder res = new StringBuilder();
    int cnt = 0;
    for (Character code : getKeys().keySet()) {
      String key = getKeys().get(code);

      res.append(key);
      res.append(' ');
      if (code < 32) {
        res.append('^');
        res.append((char)(code + '@'));
      }
      else if (code >= 128 && code <= 159) {
        res.append('~');
        res.append((char)(code - 128 + '@'));
      }
      else {
        res.append(code);
        res.append(' ');
      }
      res.append(' ');
      if (code < 0x1000) {
        res.append('0');
      }
      if (code < 0x100) {
        res.append('0');
      }
      if (code < 0x10) {
        res.append('0');
      }
      res.append(Integer.toHexString(code));
      res.append("  ");

      cnt++;
      if (cnt == colCount) {
        res.append('\n');
        cnt = 0;
      }
    }

    ExOutputModel.getInstance(((IjVimEditor) editor).getEditor()).output(res.toString());
  }

  private static final Logger logger = Logger.getInstance(DigraphGroup.class.getName());
}