import React, { useEffect } from 'react'
import { Space } from 'antd'
import { useTranslation } from 'react-i18next'
import { useLocation, useSearchParams, useNavigate } from 'react-router-dom'
import { ArrowLeftOutlined } from '@ant-design/icons'

import { formatSql, buildQueryFn, parseQueryFn } from 'utils'
import {
  AnimatedSkeleton,
  CopyLink,
  Descriptions,
  ErrorBar,
  Expand,
  Head,
  HighlightSQL,
  Pre,
  TextWithInfo
} from 'components'
import { useLocalStorageState } from 'utils'
import { CentralSlowQueryDetails, getAPI } from 'apiClient'

import DetailTabs from './DetailTabs'
import { useState } from 'react'

export interface IPageQuery {
  id: string
}

const SLOW_QUERY_DETAIL_EXPAND = 'slow_query.detail_expand'

function DetailPage() {
  const navigate = useNavigate()
  const { id } = DetailPage.parseQuery(useLocation().search)
  const [searchParams] = useSearchParams()
  const orgId = searchParams.get('orgId')
  const clusterId = searchParams.get('clusterId')

  const { t } = useTranslation()

  const [data, setData] = useState<CentralSlowQueryDetails>(null)
  const [isLoading, setLoading] = useState(false)
  const [error, setError] = useState(null)
  useEffect(() => {
    setLoading(true)
    getAPI()
      .debugPortalGetSlowQueryDetails(orgId, clusterId, id)
      .then((res) => {
        setData(res.data.log)
      })
      .catch((e) => {
        setError(e)
      })
      .finally(() => setLoading(false))
  }, [])

  const [detailExpand, setDetailExpand] = useLocalStorageState(
    SLOW_QUERY_DETAIL_EXPAND,
    {
      prev_query: false,
      query: false,
      plan: false
    }
  )

  const togglePrevQuery = () =>
    setDetailExpand((prev) => ({ ...prev!, prev_query: !prev!.prev_query }))
  const toggleQuery = () =>
    setDetailExpand((prev) => ({ ...prev!, query: !prev!.query }))
  const togglePlan = () =>
    setDetailExpand((prev) => ({ ...prev!, plan: !prev!.plan }))

  return (
    <div>
      <Head
        title={t('slow_query.detail.head.title')}
        back={
          <a onClick={() => navigate(-1)}>
            <ArrowLeftOutlined /> {t('slow_query.detail.head.back')}
          </a>
        }
      >
        <AnimatedSkeleton showSkeleton={isLoading}>
          {error && <ErrorBar errors={[error]} />}
          {!!data && (
            <>
              <Descriptions>
                <Descriptions.Item
                  span={2}
                  multiline={detailExpand.query}
                  label={
                    <Space size="middle">
                      <TextWithInfo.TransKey transKey="slow_query.detail.head.sql" />
                      <Expand.Link
                        expanded={detailExpand.query}
                        onClick={toggleQuery}
                      />
                      <CopyLink
                        displayVariant="formatted_sql"
                        data={formatSql(data.query!)}
                      />
                      <CopyLink
                        displayVariant="original_sql"
                        data={data.query!}
                      />
                    </Space>
                  }
                >
                  <Expand
                    expanded={detailExpand.query}
                    collapsedContent={
                      <HighlightSQL sql={data.query!} compact />
                    }
                  >
                    <HighlightSQL sql={data.query!} />
                  </Expand>
                </Descriptions.Item>
                {(() => {
                  if (!!data.prev_stmt && data.prev_stmt.length !== 0)
                    return (
                      <Descriptions.Item
                        span={2}
                        multiline={detailExpand.prev_query}
                        label={
                          <Space size="middle">
                            <TextWithInfo.TransKey transKey="slow_query.detail.head.previous_sql" />
                            <Expand.Link
                              expanded={detailExpand.prev_query}
                              onClick={togglePrevQuery}
                            />
                            <CopyLink
                              displayVariant="formatted_sql"
                              data={formatSql(data.prev_stmt!)}
                            />
                            <CopyLink
                              displayVariant="original_sql"
                              data={data.prev_stmt!}
                            />
                          </Space>
                        }
                      >
                        <Expand
                          expanded={detailExpand.prev_query}
                          collapsedContent={
                            <HighlightSQL sql={data.prev_stmt!} compact />
                          }
                        >
                          <HighlightSQL sql={data.prev_stmt!} />
                        </Expand>
                      </Descriptions.Item>
                    )
                })()}
                <Descriptions.Item
                  span={2}
                  multiline={detailExpand.plan}
                  label={
                    <Space size="middle">
                      <TextWithInfo.TransKey transKey="slow_query.detail.head.plan" />
                      <Expand.Link
                        expanded={detailExpand.plan}
                        onClick={togglePlan}
                      />
                      <CopyLink data={data.plan ?? ''} />
                    </Space>
                  }
                >
                  <Expand expanded={detailExpand.plan}>
                    <Pre noWrap>{data.plan}</Pre>
                  </Expand>
                </Descriptions.Item>
              </Descriptions>

              <DetailTabs data={data} />
            </>
          )}
        </AnimatedSkeleton>
      </Head>
    </div>
  )
}

DetailPage.buildQuery = buildQueryFn<IPageQuery>()
DetailPage.parseQuery = parseQueryFn<IPageQuery>()

export default DetailPage
