// deps-lint-skip-all
import { CSSObject } from '@ant-design/cssinjs';
import {
  DerivativeToken,
  useStyleRegister,
  useToken,
  UseComponentStyleResult,
  GenerateStyle,
} from '../../_util/theme';

interface ResultToken extends DerivativeToken {
  resultCls: string;
  dotIconPrefixCls: string;

  resultTitleFontSize: number;
  resultSubtitleFontSize: number;
  resultIconFontSize: number;

  resultExtraMargin: string;

  resultInfoIconColor: string;
  resultSuccessIconColor: string;
  resultWarningIconColor: string;
  resultErrorIconColor: string;
}

// ============================== Styles ==============================
const genBaseStyle: GenerateStyle<ResultToken> = (token): CSSObject => {
  const { resultCls, dotIconPrefixCls } = token;

  return {
    // Result
    [resultCls]: {
      padding: `${token.padding * 3}px ${token.padding * 2}px`,

      // RTL
      '&-rtl': {
        direction: 'rtl',
      },
    },

    // Exception Status image
    [`${resultCls} ${resultCls}-image`]: {
      // FIXME: hard code
      width: 250,
      height: 295,
      margin: 'auto',
    },

    [`${resultCls} ${resultCls}-icon`]: {
      marginBottom: token.padding * 1.5,
      textAlign: 'center',

      [`& > ${dotIconPrefixCls}`]: {
        fontSize: token.resultIconFontSize,
      },
    },

    [`${resultCls} ${resultCls}-title`]: {
      color: token.headingColor,
      fontSize: token.resultTitleFontSize,
      // FIXME: hard code
      lineHeight: 1.8,
      textAlign: 'center',
    },

    [`${resultCls} ${resultCls}-subtitle`]: {
      color: token.textColorSecondary,
      fontSize: token.resultSubtitleFontSize,
      // FIXME: hard code
      lineHeight: 1.6,
      textAlign: 'center',
    },

    [`${resultCls} ${resultCls}-content`]: {
      marginTop: token.padding * 1.5,
      padding: `${token.padding * 1.5}px ${token.padding * 2.5}px`,
      backgroundColor: token.backgroundLight,
    },

    [`${resultCls} ${resultCls}-extra`]: {
      margin: token.resultExtraMargin,
      textAlign: 'center',

      '& > *': {
        marginInlineEnd: token.paddingXS,

        '&:last-child': {
          marginInlineEnd: 0,
        },
      },
    },
  };
};

const genStatusIconStyle: GenerateStyle<ResultToken> = token => {
  const { resultCls, dotIconPrefixCls } = token;

  return {
    [`${resultCls}-success ${resultCls}-icon > ${dotIconPrefixCls}`]: {
      color: token.resultSuccessIconColor,
    },
    [`${resultCls}-error ${resultCls}-icon > ${dotIconPrefixCls}`]: {
      color: token.resultErrorIconColor,
    },
    [`${resultCls}-info ${resultCls}-icon > ${dotIconPrefixCls}`]: {
      color: token.resultInfoIconColor,
    },
    [`${resultCls}-warning ${resultCls}-icon > ${dotIconPrefixCls}`]: {
      color: token.resultWarningIconColor,
    },
  };
};

const genResultStyle: GenerateStyle<ResultToken> = token => [
  genBaseStyle(token),
  genStatusIconStyle(token),
];

// ============================== Export ==============================
const getStyle: GenerateStyle<ResultToken> = token => genResultStyle(token);

export default function useStyle(
  prefixCls: string,
  iconPrefixCls: string,
): UseComponentStyleResult {
  const [theme, token, hashId] = useToken();

  // compact 20
  // FIXME: maybe we need a new token for fontSize 12px
  const resultTitleFontSize = 24;
  const resultSubtitleFontSize = token.fontSize;
  // compact 64
  // FIXME: maybe we need a new token for fontSize 12px
  const resultIconFontSize = 72;
  const resultExtraMargin = `${token.padding * 1.5}px 0 0 0`;

  const resultInfoIconColor = token.infoColor;
  const resultErrorIconColor = token.errorColor;
  const resultSuccessIconColor = token.successColor;
  const resultWarningIconColor = token.warningColor;

  const resultToken: ResultToken = {
    ...token,
    resultCls: `.${prefixCls}`,
    dotIconPrefixCls: `.${iconPrefixCls}`,
    resultTitleFontSize,
    resultSubtitleFontSize,
    resultIconFontSize,
    resultExtraMargin,
    resultInfoIconColor,
    resultErrorIconColor,
    resultSuccessIconColor,
    resultWarningIconColor,
  };

  return [
    useStyleRegister({ theme, token, hashId, path: [prefixCls] }, () => getStyle(resultToken)),
    hashId,
  ];
}
