const enrich = require("../main");
const expect = require('chai').expect;

// メタデータの除去
const trim = (a) => {
  const dig = (f) => {
    delete f["メタデータ"];
    Object.keys(f).forEach(k => {
      const v = f[k];
      if (Array.isArray(v)) v.forEach(b => dig(b));
      else if (v && typeof v === "object") dig(v);
    });
    return f;
  };
  return dig(JSON.parse(JSON.stringify(a)));
};

// 変換＋メタデータ除去の一括処理
const enrich_and_trim = (a) => trim(enrich(a));

describe('imi-enrichment-hojin', function() {

  describe('基本動作', () => {
    describe('正常系', () => {
      it('ルートにある法人インスタンスに対する変換', function() {
        expect(enrich_and_trim({
          "@context": "https://imi.go.jp/ns/core/context.jsonld",
          "@type": "法人型",
          "表記": "株式会社ほげほげ"
        })).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "法人型",
          "表記": "株式会社ほげほげ",
          "組織種別位置": "前",
          "組織種別": {
            "@type": "コード型",
            "識別値": "301",
            "表記": "株式会社"
          }
        });
      });

      it('ルートにない法人インスタンスに対する変換', function() {
        expect(enrich_and_trim({
          "@context": "https://imi.go.jp/ns/core/context.jsonld",
          "@type": "関与型",
          "関与者": {
            "@type": "法人型",
            "表記": "株式会社ほげほげ"
          }
        })).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "関与型",
          "関与者": {
            "@type": "法人型",
            "表記": "株式会社ほげほげ",
            "組織種別位置": "前",
            "組織種別": {
              "@type": "コード型",
              "識別値": "301",
              "表記": "株式会社"
            }
          }
        });
      });

      it('@graph による複数インスタンスに対する変換', function() {
        expect(enrich_and_trim({
          "@context": "https://imi.go.jp/ns/core/context.jsonld",
          "@graph": [{
            "@type": "法人型",
            "表記": "株式会社ほげほげ"
          }, {
            "@type": "法人型",
            "表記": "ごうどう合同会社"
          }]
        })).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@graph": [{
            "@type": "法人型",
            "表記": "株式会社ほげほげ",
            "組織種別位置": "前",
            "組織種別": {
              "@type": "コード型",
              "識別値": "301",
              "表記": "株式会社"
            }
          }, {
            "@type": "法人型",
            "表記": "ごうどう合同会社",
            "組織種別位置": "後",
            "組織種別": {
              "@type": "コード型",
              "識別値": "305",
              "表記": "合同会社"
            }
          }]
        });
      });

      it('hj:法人型 に対する変換', function() {
        expect(enrich_and_trim({
          "@context": ["https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "hj:法人型",
          "表記": "株式会社ほげほげ"
        })).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "hj:法人型",
          "表記": "株式会社ほげほげ",
          "組織種別位置": "前",
          "組織種別": {
            "@type": "コード型",
            "識別値": "301",
            "表記": "株式会社"
          }
        });
      });

    });
    describe('異常系', () => {
      it('法人型が見つからない場合は警告', function() {
        const result = enrich({
          "@context": "https://imi.go.jp/ns/core/context.jsonld",
          "@type": "人型",
          "表記": "ほげほげ"
        });
        expect(result["メタデータ"]["種別"]).to.equal("WARNING");
        expect(result["メタデータ"]["説明"]).to.have.string("法人型が見つかりません");
        expect(trim(result)).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "人型",
          "表記": "ほげほげ"
        });
      });
      it('複数の法人が列挙されている場合は警告', function() {
        const result = enrich({
          "@context": "https://imi.go.jp/ns/core/context.jsonld",
          "@type": "法人型",
          "表記": "株式会社A社,B有限会社,合同会社C"
        });
        expect(result["メタデータ"]["種別"]).to.equal("WARNING");
        expect(result["メタデータ"]["説明"]).to.have.string("複数");
        expect(trim(result)).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "法人型",
          "表記": "株式会社A社,B有限会社,合同会社C"
        });
      });
      it('法人種別を判定するヒントがなく判定できなかった場合は警告', function() {
        const result = enrich({
          "@context": "https://imi.go.jp/ns/core/context.jsonld",
          "@type": "法人型",
          "表記": "A社"
        });
        expect(result["メタデータ"]["種別"]).to.equal("WARNING");
        expect(result["メタデータ"]["説明"]).to.have.string("フレーズ");
        expect(trim(result)).deep.equal({
          "@context": [
            "https://imi.go.jp/ns/core/context.jsonld",
            "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
          ],
          "@type": "法人型",
          "表記": "A社"
        });
      });
    });
  });

  describe('各種の法人表記に対する対応', () => {


    it('前株', function() {
      expect(enrich_and_trim({
        "@context": "https://imi.go.jp/ns/core/context.jsonld",
        "@type": "法人型",
        "表記": "株式会社ほげほげ"
      })).deep.equal({
        "@context": [
          "https://imi.go.jp/ns/core/context.jsonld",
          "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
        ],
        "@type": "法人型",
        "表記": "株式会社ほげほげ",
        "組織種別位置": "前",
        "組織種別": {
          "@type": "コード型",
          "識別値": "301",
          "表記": "株式会社"
        }
      });
    });

    it('後株', function() {
      expect(enrich_and_trim({
        "@context": "https://imi.go.jp/ns/core/context.jsonld",
        "@type": "法人型",
        "表記": "ほげほげ株式会社"
      })).deep.equal({
        "@context": [
          "https://imi.go.jp/ns/core/context.jsonld",
          "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
        ],
        "@type": "法人型",
        "表記": "ほげほげ株式会社",
        "組織種別位置": "後",
        "組織種別": {
          "@type": "コード型",
          "識別値": "301",
          "表記": "株式会社"
        }
      });
    });

    it('中間', function() {
      expect(enrich_and_trim({
        "@context": "https://imi.go.jp/ns/core/context.jsonld",
        "@type": "法人型",
        "表記": "ほげほげ株式会社2019年設立"
      })).deep.equal({
        "@context": [
          "https://imi.go.jp/ns/core/context.jsonld",
          "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
        ],
        "@type": "法人型",
        "表記": "ほげほげ株式会社2019年設立",
        "組織種別": {
          "@type": "コード型",
          "識別値": "301",
          "表記": "株式会社"
        }
      });
    });

    it('公益財団法人・財団法人', function() {
      expect(enrich_and_trim({
        "@context": "https://imi.go.jp/ns/core/context.jsonld",
        "@type": "法人型",
        "表記": "公益財団法人ほげほげ会"
      })).deep.equal({
        "@context": [
          "https://imi.go.jp/ns/core/context.jsonld",
          "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
        ],
        "@type": "法人型",
        "表記": "公益財団法人ほげほげ会",
        "組織種別位置": "前",
        "組織種別": {
          "@type": "コード型",
          "識別値": "399",
          "表記": "その他の設立登記法人"
        }
      });

      expect(enrich_and_trim({
        "@context": "https://imi.go.jp/ns/core/context.jsonld",
        "@type": "法人型",
        "表記": "財団法人ほげほげ会"
      })).deep.equal({
        "@context": [
          "https://imi.go.jp/ns/core/context.jsonld",
          "http://hojin-info.go.jp/ns/domain/biz/1/context.jsonld"
        ],
        "@type": "法人型",
        "表記": "財団法人ほげほげ会",
        "組織種別位置": "前",
        "組織種別": {
          "@type": "コード型",
          "識別値": "399",
          "表記": "その他の設立登記法人"
        }
      });
    });
  });


});
