# frozen_string_literal: true

require "bcdice/dice_table/table"
require "bcdice/dice_table/d66_grid_table"
require "bcdice/arithmetic"

module BCDice
  module GameSystem
    class AngelGear < Base
      # ゲームシステムの識別子
      ID = 'AngelGear'

      # ゲームシステム名
      NAME = 'エンゼルギア 天使大戦TRPG The 2nd Editon'

      # ゲームシステム名の読みがな
      SORT_KEY = 'えんせるきあ2'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~MESSAGETEXT
        ・判定　nAG[s][±a]
        []内は省略可能。
        n:判定値
        s:技能値
        a:修正
        （例）
        12AG 10AG3±20

        ・感情表　ET
      MESSAGETEXT

      def initialize(command)
        super(command)

        @sort_barabara_dice = true # バラバラロール（Bコマンド）でソート有
      end

      def eval_game_system_specific_command(command)
        if (m = /^(\d+)AG(\d+)?(([+-]\d+)*)$/.match(command))
          resolute_action(m[1].to_i, m[2]&.to_i, m[3], command)
        else
          roll_tables(command, TABLES)
        end
      end

      def resolute_action(num_dice, skill_value, modify, command)
        dice = @randomizer.roll_barabara(num_dice, 6).sort
        dice_text = dice.join(",")
        modify_n = 0
        success = 0
        if skill_value
          success = dice.count { |val| val <= skill_value }
          modify_n = Arithmetic.eval(modify, RoundType::FLOOR) unless modify.empty?
        end

        gospel = '(福音発生)' if success + modify_n >= 100

        output = "(#{command}) ＞ #{success}[#{dice_text}]#{format('%+d', modify_n)} ＞ 成功数: #{success + modify_n}#{gospel}"

        if success + modify_n >= 100
          Result.critical(output)
        elsif 0 < success + modify_n
          Result.success(output)
        else
          Result.failure(output)
        end
      end

      TABLES = {
        'ET' => DiceTable::D66GridTable.new(
          '感情表',
          [
            [
              '好奇心（好奇心）',
              '憧れ（あこがれ）',
              '尊敬（そんけい）',
              '仲間意識（なかまいしき）',
              '母性愛（ぼせいあい）',
              '感心（かんしん）'
            ],
            [
              '純愛（じゅんあい）',
              '友情（ゆうじょう）',
              '同情（どうじょう）',
              '父性愛（ふせいあい）',
              '幸福感（こうふくかん）',
              '信頼（しんらい）'
            ],
            [
              '競争心（きょうそうしん）',
              '親近感（しんきんかん）',
              'まごころ',
              '好意（こうい）',
              '有為（ゆうい）',
              '崇拝（すうはい）'
            ],
            [
              '大嫌い（だいきらい）',
              '妬み（ねたみ）',
              '侮蔑（ぶべつ）',
              '腐れ縁（くされえん）',
              '恐怖（きょうふ）',
              '劣等感（れっとうかん）'
            ],
            [
              '偏愛（へんあい）',
              '寂しさ（さびしさ）',
              '憐憫（れんびん）',
              '闘争心（とうそうしん）',
              '食傷（しょくしょう）',
              '嘘つき（うそつき）'
            ],
            [
              '甘え（あまえ）',
              '苛立ち（いらだち）',
              '下心（したごころ）',
              '憎悪（ぞうお）',
              '疑惑（ぎわく）',
              '支配（しはい）'
            ],
          ]
        )
      }.freeze

      register_prefix('\d+AG', TABLES.keys)
    end
  end
end
