# frozen_string_literal: true

require 'bcdice/dice_table/table'
require 'bcdice/dice_table/d66_table'
require 'bcdice/arithmetic'
require 'bcdice/command/parser'

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

      # ゲームシステム名
      NAME = 'バケノカワ'

      # ゲームシステム名の読みがな
      #
      # 「ゲームシステム名の読みがなの設定方法」（docs/dicebot_sort_key.md）を参考にして
      # 設定してください
      SORT_KEY = 'はけのかわ'

      # ダイスボットの使い方
      HELP_MESSAGE = <<~MESSAGETEXT
        ・行為判定
          xBKy@z
            x：振るダイスの数(省略可、省略した場合は2)
            y：振るダイスの面数
            z：スペシャル値(@ごと省略可、省略した場合は12)
          （例）BK10
          　　　4BK6
          　　　2BK6@10

        ・各種表
          今の関係表 NRT
          カイブツ時代からの因縁表 KKT
          調査演出表
            カイブツ RTK
            バケノカワ RTB
          コラボテーマ表
            カイブツ CTK
            バケノカワ CTB
          ファンブル表 FT
      MESSAGETEXT

      def initialize(command)
        super(command)
        @sort_barabara_dice = true
        @d66_sort_type = D66SortType::ASC
      end

      def eval_game_system_specific_command(command)
        return check_action(command) || roll_tables(command, TABLES)
      end

      def check_action(command)
        parser = Command::Parser.new("BK", round_type: RoundType::FLOOR).enable_critical.enable_prefix_number.has_suffix_number
        parsed = parser.parse(command)
        return nil if parsed.nil?

        target = 4
        dice_cnt = parsed.prefix_number || 2
        dice_faces = parsed.suffix_number
        special_target = parsed.critical || 12

        debug("dice_faces", dice_faces)
        debug("dice_cnt", dice_cnt)
        debug("special_target", special_target)

        dice_arr = @randomizer.roll_barabara(dice_cnt, dice_faces).sort
        dice_str = dice_arr.join(",")
        dice_sum = dice_arr.sum
        has_special = dice_sum >= special_target
        has_fumble = dice_sum <= 2
        result = dice_arr.count { |x| x >= target } >= 1

        Result.new.tap do |r|
          r.text = "(#{dice_cnt}B#{dice_faces}>=#{target}) ＞ [#{dice_str}] ＞ #{dice_sum} ＞ #{result ? '成功' : '失敗'}#{has_special ? '(スペシャル)' : ''}#{has_fumble ? '(ファンブル)' : ''}"
          r.critical = has_special
          r.fumble = has_fumble
          r.success = result
          r.failure = !r.success?
        end
      end

      TABLES = {
        'NRT' => DiceTable::D66Table.new(
          '今の関係表',
          D66SortType::ASC,
          {
            11 => 'バケノカワ同士が親戚だった',
            12 => '仲のいい職場の同僚',
            13 => '仕事のことで助けてもらったことがある',
            14 => '人間社会のことを教え合っている',
            15 => '施設同士がよくコラボする',
            16 => '街のお店に二人で出かける仲',
            22 => 'どうにもウマが合わずに喧嘩ばかりしている',
            23 => 'そのバケノカワを羨ましいと思っていた',
            24 => 'バケノカワに関する苦労を聞いたことがある',
            25 => 'バケノカワとしての生活圏が近い',
            26 => 'バケノカワ同士が知り合いだった',
            33 => 'あんな人間になりたいと憧れを覚えた',
            34 => '友人として色々な悩みを共に解決してきた',
            35 => '放っておけないところがあると思っている',
            36 => 'いつも迷惑をかけて悪いと思っている',
            44 => '毎朝挨拶をするようなご近所さん／寮の部屋が隣',
            45 => '何か悩んでいそうな顔が気になった',
            46 => '何かと仕事関係で助けてもらい、世話になっている',
            55 => '立ち振る舞いが人間らしくて羨ましい',
            56 => 'ワンダーランドでの振る舞いや仕事ぶりに一目置いている',
            66 => 'そのバケノカワを見ると懐かしさを覚える',
          }
        ),
        'KKT' => DiceTable::D66Table.new(
          'カイブツ時代からの因縁表',
          D66SortType::ASC,
          {
            11 => '一緒の牢獄に捕まっていたことがある',
            12 => '地下の国で一緒に遊んでいたことがある',
            13 => '地上に出て人間を楽しませる夢を語り合った',
            14 => '一緒に人間社会を学ぶ訓練を受けた',
            15 => '生まれた時からずっと一緒だった',
            16 => '時々喧嘩をし合うような仲だった',
            22 => '幼少期に育ててもらった恩がある',
            23 => '昔助けてもらった時の借りがある',
            24 => '思い出せないぐらい昔に、助けてもらった……気がする',
            25 => '一緒に地上で人間を楽しませようと約束した',
            26 => '人間に対する憧れを語った',
            33 => 'カイブツ時代、一方的に憧れを抱いていた',
            34 => '人間のまね事を一緒にしていた',
            35 => '少しの間、一緒に暮らしていたことがある',
            36 => '一緒にお茶会をした仲',
            44 => '同じ親のもとで育った',
            45 => 'カイブツ時代に貸しがあって、まだ返してもらってない',
            46 => '何かと競い合う、ライバル同士だった',
            55 => '戦いを挑み、ボコボコにされた',
            56 => '一緒に退屈を紛らわすために色々悪だくみしていた',
            66 => 'バケノカワを貰った後にやりたいことを語ってもらった覚えがある',
          }
        ),
        'RTK' => DiceTable::Table.new(
          '調査演出表　カイブツ',
          '1D10',
          [
            'カイブツとして街に潜み、チェインNPCの周りを調べて回った',
            'カイブツとしての力を使い、チェインNPCを尾行して好みを調べた',
            '人間には潜入できないルートを使って、チェインNPCの周りを調べた',
            '人間として調べてみようとしたが、カイブツとしての特徴が出て困った',
            'カイブツとしての特徴を調査に活かし、調べ上げた',
            '魔法の鏡に問いかけて、答えを貰った',
            'チェインNPCの痕跡から、魔法の力を使って過去を辿った',
            '仲間のカイブツたちと一緒に、街に繰り出してドタバタ劇を繰り広げながら情報を集めた',
            '小さなカイブツたちに、気付かれないようにチェインNPCを調べてもらった',
            '魔女のカイブツに頼んで、調査に便利な薬を作ってもらった,'
          ]
        ),
        'RTB' => DiceTable::Table.new(
          '調査演出表　バケノカワ',
          '1D10',
          [
            '人間の友人を頼ってチェインNPCの噂話を聞く',
            '人間の街に行ってチェインNPCのことを聞いて回る',
            'チェインPCに話を聞いて、その子の特徴から好みを推察する',
            'チェインPCと一緒に、チェインNPCの周囲を聞き込みして回った',
            '人間として、情報通の人間が集まる場所に向かい、そこでいろいろな話を聞いて回った',
            'ネットを利用して、チェインNPCの痕跡がないか調べてみた',
            'チェインNPCがよく行く場所を掴み、そこで情報収集をした',
            '実は、チェインNPCは自分のバケノカワとして会ったことがあり、そのときのことを思い出した',
            '実は、チェインNPCはお客様として自分の担当施設に来たことがあり、そのときの印象を思い出した',
          ]
        ),
        'CTK' => DiceTable::D66Table.new(
          'コラボテーマ表　カイブツ',
          D66SortType::ASC,
          {
            11 => '自分とコラボ相手の「カイブツとしての姿」を使ったド派手なコラボ',
            12 => '自分の特徴を使ったコラボ',
            13 => 'コラボ相手の特徴を使ったコラボ',
            14 => '自分とコラボ相手の特徴を活かすコラボ',
            15 => '自分の施設とコラボ相手の特徴を合わせたコラボ',
            16 => 'コラボ相手の施設と自分の特徴を合わせたコラボ',
            22 => '自分とコラボ相手の「カイブツとしての力」を使ったコラボ',
            23 => '自分とコラボ相手のパビリオンを活かすコラボ',
            24 => '自分のカイブツとしての力を使ったコラボ',
            25 => '相手のカイブツとしての力を使ったコラボ',
            26 => '自分がカイブツとして優れているところを、コラボ相手に聞いてヒントにする',
            33 => 'カイブツとしての姿をキャラクターグッズとして売り出すコラボ',
            34 => '魔法の力を演出に使った、キラキラのコラボ',
            35 => '魔法の道具を使った、お客様を驚かせるようなコラボ',
            36 => '童話の世界をくっつけて、ちぐはぐな感じを楽しんでもらう',
            44 => 'パビリオンの仲間たちを集めたステージを開催',
            45 => 'カイブツとしての姿をあえて晒し、それを「演出」に組み込む',
            46 => '自分たちの力を「演出」として使ったコラボ',
            55 => '魔法の力がかかったお土産を持たせるコラボ',
            56 => '不思議な演出がいっぱいのコラボ',
            66 => '自分たち以外のカイブツも呼んだ、賑やかなコラボ',
          }
        ),
        'CTB' => DiceTable::D66Table.new(
          'コラボテーマ表　バケノカワ',
          D66SortType::ASC,
          {
            11 => 'バケノカワとして生活するうちに覚えた、「楽しかったこと」をやってみる',
            12 => 'コラボ相手の施設におじゃまするコラボ',
            13 => '自分の施設にコラボ相手を呼ぶ',
            14 => '自分とコラボ相手の施設にお土産を用意する',
            15 => 'コラボ相手の施設の要素を使う',
            16 => '自分の施設の要素をコラボ相手の施設に贈る',
            22 => 'バケノカワ生活の中で気付いた、「人間は面白い」と思えたことをやる',
            23 => '自分とコラボ相手の技能で園全体を盛り上げる',
            24 => '自分の技能をコラボ相手の施設に活かす',
            25 => 'パートナーの技能を自分の施設に活かす',
            26 => '自分のカバーパーソナルを活かすコラボ',
            33 => '自分だけではできないことをコラボ相手と相談する',
            34 => 'パートナーのカバーパーソナルを活かすコラボ',
            35 => '二つの施設を合わせたような施設を限定オープン',
            36 => 'お客様の笑顔を思い出し、そうなるように二人で努力する',
            44 => '二つの施設を繋げる園内バスを用意する',
            45 => 'お客様に楽しんでもらえる演出を二人で考える',
            46 => 'お客様が好みそうなお土産を二人で考える',
            55 => '人間の友達に、「何が楽しいのか」を改めて聞く',
            56 => 'バケノカワの伝手を使って、人間の友達に話を聞く',
            66 => 'ワンダーランドのみんなに手伝ってもらう豪華なコラボ',
          }
        ),
        'FT' => DiceTable::Table.new(
          'ファンブル表',
          '1D6',
          [
            '「あれ？”自分”は一体何者だったかな？」カバーパーソナルを1つ選んで失う',
            'ふとした瞬間に、楽しい感情に対して懐疑的になってしまう。ワンダートークンを1個選んで失う',
            'せっかく用意した道具を壊してしまう。セットしていたサプライズカードを1枚選んで破棄する',
            'バケノカワの記憶が思い出される。カバーパーソナルとそれに付随するパーソナル技能を1つずつ獲得する',
            'カイブツとしての自分が前面に出てしまう。次に行う判定の間、すべての技能を修得していないものとして扱う',
            '失敗してしまったが、それがお客様にウケた。ワンダートークンを1個獲得する',
          ]
        ),
      }.freeze

      # ダイスボットで使用するコマンドを配列で列挙する
      register_prefix('\d*BK', TABLES.keys)
    end
  end
end
