import { useStateValue } from "@guanghechen/react-viewmodel";
import type { Code } from "@yozora/ast";
import { useNodeRendererContext, type INodeRenderer, IReactMarkdownThemeScheme } from "../context";
import { CodeRendererInner } from "./inner/CodeRendererInner";

/**
 * Render `code`
 *
 * @see https://www.npmjs.com/package/@yozora/ast#code
 * @see https://www.npmjs.com/package/@yozora/tokenizer-indented-code
 * @see https://www.npmjs.com/package/@yozora/tokenizer-fenced-code
 */
export const CodeRenderer: INodeRenderer<Code> = props => {
  const { lang } = props;
  const value: string = props.value.replace(/[\r\n]+$/, ""); // Remove trailing line endings.

  const { viewmodel } = useNodeRendererContext();
  const preferCodeWrap: boolean = useStateValue(viewmodel.preferCodeWrap$);
  const showCodeLineno: boolean = useStateValue(viewmodel.showCodeLineno$);
  const themeScheme: IReactMarkdownThemeScheme = useStateValue(viewmodel.themeScheme$);
  const darken: boolean = themeScheme === "darken";

  return (
    <CodeRendererInner
      darken={darken}
      lang={lang ?? "text"}
      value={value}
      preferCodeWrap={preferCodeWrap}
      showCodeLineno={showCodeLineno}
    />
  );
};