import { CurrentUserMark } from '../../types/mark.ts'
import styles from './style.module.scss'

import { MARK_TYPE_TRANSLATION, NEXT, SIGN } from '../../utils/const.ts'
import {
  findNextIncompleteCurrentUserMark,
  isCurrentUserMarksComplete,
  isCurrentValueLast
} from '../../utils'

interface MarkFormFieldProps {
  handleSubmit: (event: any) => void
  handleSelectedMarkValueChange: (event: any) => void
  selectedMark: CurrentUserMark
  selectedMarkValue: string
  currentUserMarks: CurrentUserMark[]
  handleCurrentUserMarkChange: (mark: CurrentUserMark) => void
}

/**
 * Responsible for rendering a form field connected to a mark and keeping track of its value.
 */
const MarkFormField = ({
  handleSubmit,
  handleSelectedMarkValueChange,
  selectedMark,
  selectedMarkValue,
  currentUserMarks,
  handleCurrentUserMarkChange
}: MarkFormFieldProps) => {
  const getSubmitButtonText = () => (isReadyToSign() ? SIGN : NEXT)
  const isReadyToSign = () =>
    isCurrentUserMarksComplete(currentUserMarks) ||
    isCurrentValueLast(currentUserMarks, selectedMark, selectedMarkValue)
  const isCurrent = (currentMark: CurrentUserMark) =>
    currentMark.id === selectedMark.id
  const isDone = (currentMark: CurrentUserMark) => currentMark.isCompleted
  const findNext = () => {
    return (
      currentUserMarks[selectedMark.id] ||
      findNextIncompleteCurrentUserMark(currentUserMarks)
    )
  }
  const handleFormSubmit = (event: React.FormEvent<HTMLFormElement>) => {
    event.preventDefault()
    console.log('handle form submit runs...')
    return isReadyToSign()
      ? handleSubmit(event)
      : handleCurrentUserMarkChange(findNext()!)
  }
  return (
    <div className={styles.container}>
      <div className={styles.actions}>
        <div className={styles.actionsWrapper}>
          <div className={styles.actionsTop}>
            <div className={styles.actionsTopInfo}>
              <p className={styles.actionsTopInfoText}>Add your signature</p>
            </div>
          </div>
          <div className={styles.inputWrapper}>
            <form onSubmit={(e) => handleFormSubmit(e)}>
              <input
                className={styles.input}
                placeholder={
                  MARK_TYPE_TRANSLATION[selectedMark.mark.type.valueOf()]
                }
                onChange={handleSelectedMarkValueChange}
                value={selectedMarkValue}
              />
              <div className={styles.actionsBottom}>
                <button type="submit" className={styles.submitButton}>
                  {getSubmitButtonText()}
                </button>
              </div>
            </form>
            <div className={styles.footerContainer}>
              <div className={styles.footer}>
                {currentUserMarks.map((mark, index) => {
                  return (
                    <div className={styles.pagination} key={index}>
                      <button
                        className={`${styles.paginationButton} ${isDone(mark) && styles.paginationButtonDone}`}
                        onClick={() => handleCurrentUserMarkChange(mark)}
                      >
                        {mark.id}
                      </button>
                      {isCurrent(mark) && (
                        <div className={styles.paginationButtonCurrent}></div>
                      )}
                    </div>
                  )
                })}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

export default MarkFormField
