import { gql } from 'graphql-request'
import fetchAPI from '@/lib/api/fetchAPI'

export type SubmitButton = {
  text: string
  type: string
  defaultValue: string
}

export type TextField = {
  __typename: 'TextField' | 'EmailField' | 'PhoneField' | 'TextAreaField'
  id: string
  label: string
  type: string
  defaultValue: string
  pageNumber: number
  isRequired: boolean
  placeholder?: string | null
  errorMessage?: string | null
}

export type OtherField = {
  __typename: 'OtherField'
  id: string
  label: string
  type: string
  defaultValue: string
  pageNumber: number
  isRequired: boolean
  placeholder?: string | null
  errorMessage?: string | null
}

export type ConsentField = {
  __typename: 'ConsentField'
  id: string
  checkboxLabel: string
  errorMessage?: string | null
  pageNumber: number
  label: string
  type: string
  defaultValue: string
  isRequired: boolean
}

export type SelectField = {
  __typename: 'SelectField' | 'RadioField'
  id: string
  label: string
  type: string
  pageNumber: number
  defaultValue: string
  isRequired: boolean
  placeholder?: string | null
  errorMessage?: string | null
  choices: Array<{
    text: string
    value: string
  }>
}

export type PageField = {
  __typename: 'PageField'
  id: string
  type: string
  pageNumber: number
  defaultValue: string
  nextButton: {
    text: string
  }
  previousButton: {
    text: string
  }
}

export type HtmlField = {
  __typename: 'HtmlField'
  id: string
  label: string
  pageNumber: number
  conditionalLogic?: ConditionalLogic | null
  isRequired: boolean
  type: string
  defaultValue: string
  content: string
}

export type NumberField = {
  __typename: 'NumberField'
  id: string
  label: string
  type: string
  defaultValue: string
  pageNumber: number
  placeholder?: string | null
  errorMessage?: string | null
  description?: string | null
  isRequired: boolean
}

export type ConditionalFieldRule = {
  fieldId: string
  operator: string
  value: string
}

export type ConditionalLogic = {
  actionType: string
  logicType: string
  pageNumber: number
  rules: Array<{
    fieldId: string
    operator: string
    value: string
  }>
}

export type CheckboxField = {
  __typename: 'CheckboxField'
  id: string
  label: string
  type: string
  pageNumber: number
  defaultValue: string
  isRequired: boolean
  conditionalLogic?: ConditionalLogic | null
  choices: Array<{
    text: string
    value: string
  }>
}

export type FormField =
  | TextField
  | ConsentField
  | SelectField
  | PageField
  | HtmlField
  | NumberField
  | CheckboxField
  | OtherField

export type FormFields = {
  nodes: Array<FormField>
}

export type PageNode = {
  slug: string
  uri: string
}

export type Confirmation = {
  type: string
  defaultValue: string
  page: {
    node: PageNode
  }
}

export type GfForm = {
  title: string
  submitButton: SubmitButton
  formFields: FormFields
  formId: number
  confirmations: Array<Confirmation>
}

export type GeneralInquiryFormResponse = {
  gfForm: GfForm
}

export async function getGeneralInquiryForm(formId: number) {
  const data: GeneralInquiryFormResponse = await fetchAPI(
    gql`
      query GeneralInquiryForm($id: ID!) {
        gfForm(id: $id, idType: DATABASE_ID) {
          title
          submitButton {
            text
            type
          }
          formFields {
            nodes {
              ... on TextField {
                __typename
                id
                label
                type
                defaultValue
                pageNumber
                isRequired
                placeholder
                errorMessage
              }
              ... on EmailField {
                __typename
                id
                label
                type
                isRequired
                pageNumber
                placeholder
                errorMessage
              }
              ... on PhoneField {
                __typename
                id
                label
                type
                defaultValue
                pageNumber
                isRequired
                placeholder
                errorMessage
              }
              ... on ConsentField {
                __typename
                id
                checkboxLabel
                errorMessage
                pageNumber
                label
                type
                isRequired
              }
              ... on SelectField {
                __typename
                id
                label
                type
                defaultValue
                pageNumber
                isRequired
                placeholder
                errorMessage
                choices {
                  text
                  value
                }
              }
              ... on RadioField {
                __typename
                id
                label
                type
                errorMessage
                pageNumber
                isRequired
                choices {
                  text
                  value
                }
              }
              ... on TextAreaField {
                __typename
                id
                label
                type
                defaultValue
                pageNumber
                placeholder
                isRequired
                errorMessage
              }
              ... on PageField {
                id
                __typename
                type
                pageNumber
                nextButton {
                  text
                }
                previousButton {
                  text
                }
              }
              ... on HtmlField {
                id
                label
                __typename
                pageNumber
                conditionalLogic {
                  actionType
                  logicType
                  rules {
                    fieldId
                    operator
                    value
                  }
                }
                type
                content
                conditionalLogic {
                  actionType
                  logicType
                  rules {
                    fieldId
                    operator
                    value
                  }
                }
              }
              ... on NumberField {
                id
                label
                __typename
                type
                pageNumber
                placeholder
                errorMessage
                description
                isRequired
              }
              ... on CheckboxField {
                id
                label
                __typename
                type
                isRequired
                conditionalLogic {
                  actionType
                  logicType
                  rules {
                    fieldId
                    operator
                    value
                  }
                }
                choices {
                  text
                  value
                }
              }
              pageNumber
              type
              databaseId
            }
          }
          formId
          confirmations {
            type
            page {
              node {
                slug
                uri
              }
            }
          }
        }
      }
    `,
    {
      variables: {
        id: formId,
      },
    }
  )

  return data?.gfForm
}
