import React from 'react';

import { NAMESPACE_CONFIG, Namespace, Rule } from '../../config';
import { parseDescription, t } from '../utils';

interface RuleTableProps {
  namespace: Namespace;
  hideOff: boolean;
}

export const RuleTable: React.FC<RuleTableProps> = ({ namespace, hideOff }) => {
  return (
    <div className="container-fluid">
      <div className="flex-left flex-wrap units-gap hide-on-mobile">
        <h3 className="unit-1-3 unit-1-on-mobile site-table-header-text">{t('规则说明')}</h3>
        <h3 className="unit-1-3 unit-1-on-mobile text-danger site-table-header-text">{t('错误的示例')}</h3>
        <h3 className="unit-1-3 unit-1-on-mobile text-success site-table-header-text">{t('正确的示例')}</h3>
      </div>
      {Object.values<Rule>(NAMESPACE_CONFIG[namespace].ruleConfig).map(
        ({
          name,
          value,
          description,
          reason,
          badExample,
          goodExample,
          fixable,
          extendsBaseRule,
          requiresTypeChecking,
        }) => (
          <div
            id={name}
            key={name}
            className={`flex-left flex-wrap top-gap-big units-gap site-row ${
              value === 'off' ? 'site-row-off site-row-wide' : ''
            }`}
            style={
              value === 'off' && hideOff
                ? {
                    display: 'none',
                  }
                : {}
            }
          >
            <div className="unit-1-3 unit-1-on-mobile site-desc">
              <a href={NAMESPACE_CONFIG[namespace].getDocsUrl(name)}>{name}</a>
              &nbsp;&nbsp;
              <span data-tip={t('可使用 --fix 自动修复')} data-type="success">
                {fixable && '🔧'}
              </span>
              <span data-tip={t('需要类型信息')} data-type="warning">
                {requiresTypeChecking && '💭'}
              </span>
              <a data-tip={t('继承自 ') + extendsBaseRule} data-type="warning" href={`?rule=base#${extendsBaseRule}`}>
                {extendsBaseRule && '👀'}
              </a>
              <a className="site-anchor" href={`#${name}`}>
                #
              </a>
              <p
                className="top-gap-0"
                dangerouslySetInnerHTML={{
                  __html: parseDescription(t(description)),
                }}
              />
              {reason && (
                <p
                  className="text-muted text-small"
                  style={{ marginTop: 5 }}
                  dangerouslySetInnerHTML={{
                    __html: parseDescription(reason),
                  }}
                />
              )}
              {Array.isArray(value) && (
                <div className="text-muted text-small site-rule-value">
                  {t('配置：')}
                  {typeof value[1] === 'object' ? (
                    <pre>
                      <code>{`["error", ${JSON.stringify(value[1], null, 4)}]`}</code>
                    </pre>
                  ) : (
                    <code>{`["error", ${JSON.stringify(value[1])}]`}</code>
                  )}
                </div>
              )}
            </div>
            <div className="unit-1-3 unit-1-on-mobile">
              {badExample && (
                <pre className={`language-${NAMESPACE_CONFIG[namespace].prismLanguage} site-code`}>
                  <code
                    dangerouslySetInnerHTML={{
                      __html: badExample,
                    }}
                  />
                </pre>
              )}
            </div>
            <div className="unit-1-3 unit-1-on-mobile">
              {goodExample && (
                <pre className={`language-${NAMESPACE_CONFIG[namespace].prismLanguage}  site-code`}>
                  <code
                    dangerouslySetInnerHTML={{
                      __html: goodExample,
                    }}
                  />
                </pre>
              )}
            </div>
          </div>
        ),
      )}
    </div>
  );
};
