'use client'

import { useState } from 'react'
import Link from 'next/link'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { Plus, Megaphone, CalendarOff } from 'lucide-react'
import { toast } from 'sonner'
import { api, type PaginatedResponse, type Assignment, type Site } from '@/lib/api'
import { DataTable } from '@/components/DataTable'
import { Button } from '@/components/ui/Button'
import { Badge } from '@/components/ui/Badge'
import { Select } from '@/components/ui/Select'
import { PermissionGate } from '@/components/auth/PermissionGate'
import { formatDate } from '@/lib/utils'

const statusVariant = (status: string) => {
  if (status === 'published' || status === 'completed') return 'success'
  if (status === 'cancelled') return 'danger'
  return 'muted'
}

export function AssignmentsPage() {
  const { t } = useTranslation()
  const queryClient = useQueryClient()
  const [search, setSearch] = useState('')
  const [status, setStatus] = useState('')
  const [page, setPage] = useState(1)
  const [showPublish, setShowPublish] = useState(false)
  const [showDayOff, setShowDayOff] = useState(false)
  const [publishSiteId, setPublishSiteId] = useState('')
  const [publishDate, setPublishDate] = useState(() => new Date().toISOString().slice(0, 10))
  const [dayOffDate, setDayOffDate] = useState(() => new Date().toISOString().slice(0, 10))
  const [dayOffStatus, setDayOffStatus] = useState<'paid_day_off' | 'unpaid_day_off'>(
    'paid_day_off',
  )

  const { data, isLoading } = useQuery({
    queryKey: ['assignments', search, status, page],
    queryFn: () =>
      api.get<PaginatedResponse<Assignment>>('/assignments', {
        params: { search: search || undefined, status: status || undefined, page, per_page: 25 },
      }),
  })

  const sites = useQuery({
    queryKey: ['sites-options'],
    queryFn: () =>
      api.get<PaginatedResponse<Site>>('/sites', { params: { per_page: 100, status: 'active' } }),
  })

  const remove = useMutation({
    mutationFn: (id: number) => api.delete(`/assignments/${id}`),
    onSuccess: () => {
      toast.success(t('assignments.messages.deleted'))
      queryClient.invalidateQueries({ queryKey: ['assignments'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

  const publishDay = useMutation({
    mutationFn: () =>
      api.post('/assignments/publish-day', {
        site_id: publishSiteId,
        date: publishDate,
      }),
    onSuccess: (res) => {
      const count = (res.data as { data?: { published_count?: number } })?.data?.published_count ?? 0
      toast.success(t('assignments.messages.publishedDay', { count }))
      setShowPublish(false)
      queryClient.invalidateQueries({ queryKey: ['assignments'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

  const globalDayOff = useMutation({
    mutationFn: () =>
      api.post('/assignments/global-day-off', {
        date: dayOffDate,
        status: dayOffStatus,
      }),
    onSuccess: (res) => {
      const count =
        (res.data as { data?: { attendance_count?: number } })?.data?.attendance_count ?? 0
      toast.success(t('assignments.messages.globalDayOff', { count }))
      setShowDayOff(false)
      queryClient.invalidateQueries({ queryKey: ['assignments'] })
      queryClient.invalidateQueries({ queryKey: ['attendances'] })
    },
    onError: () => toast.error(t('common.somethingWentWrong')),
  })

  const rows = data?.data.data ?? []
  const meta = data?.data.meta

  const statusOptions = [
    { value: '', label: t('common.allStatuses') },
    ...(['draft', 'published', 'completed', 'cancelled'] as const).map((value) => ({
      value,
      label: t(`assignments.status.${value}`),
    })),
  ]

  const siteOptions = [
    { value: '', label: t('assignments.selectSite') },
    ...(sites.data?.data.data ?? []).map((s) => ({
      value: String(s.id),
      label: s.name,
    })),
  ]

  return (
    <div className="space-y-5">
      <div className="animate-fade-in-up flex flex-wrap items-center justify-between gap-3">
        <h1 className="premium-heading text-2xl font-bold" data-tour="page-heading">{t('assignments.title')}</h1>
        <div className="flex flex-wrap gap-2">
          <PermissionGate permission="assignments.manage">
            <Button size="sm" variant="secondary" onClick={() => setShowPublish(true)}>
              <Megaphone size={14} />
              {t('assignments.publishDay')}
            </Button>
            <Button size="sm" variant="secondary" onClick={() => setShowDayOff(true)}>
              <CalendarOff size={14} />
              {t('assignments.globalDayOff')}
            </Button>
            <Link href="/assignments/new">
              <Button size="sm">
                <Plus size={14} />
                {t('assignments.create')}
              </Button>
            </Link>
          </PermissionGate>
        </div>
      </div>

      {showPublish ? (
        <div className="animate-fade-in-up premium-card space-y-3 rounded-2xl p-4">
          <h2 className="text-sm font-semibold">{t('assignments.publishDay')}</h2>
          <div className="grid gap-3 sm:grid-cols-3">
            <Select
              value={publishSiteId}
              onChange={(e) => setPublishSiteId(e.target.value)}
              options={siteOptions}
            />
            <input
              type="date"
              value={publishDate}
              onChange={(e) => setPublishDate(e.target.value)}
              className="rounded-xl border border-[var(--premium-border)] bg-transparent px-3 py-2 text-sm"
            />
            <div className="flex gap-2">
              <Button
                size="sm"
                disabled={!publishSiteId || publishDay.isPending}
                onClick={() => publishDay.mutate()}
              >
                {t('common.save')}
              </Button>
              <Button size="sm" variant="ghost" onClick={() => setShowPublish(false)}>
                {t('common.cancel')}
              </Button>
            </div>
          </div>
        </div>
      ) : null}

      {showDayOff ? (
        <div className="animate-fade-in-up premium-card space-y-3 rounded-2xl p-4">
          <h2 className="text-sm font-semibold">{t('assignments.globalDayOff')}</h2>
          <div className="grid gap-3 sm:grid-cols-3">
            <input
              type="date"
              value={dayOffDate}
              onChange={(e) => setDayOffDate(e.target.value)}
              className="rounded-xl border border-[var(--premium-border)] bg-transparent px-3 py-2 text-sm"
            />
            <Select
              value={dayOffStatus}
              onChange={(e) =>
                setDayOffStatus(e.target.value as 'paid_day_off' | 'unpaid_day_off')
              }
              options={[
                { value: 'paid_day_off', label: t('attendances.status.paid_day_off') },
                { value: 'unpaid_day_off', label: t('attendances.status.unpaid_day_off') },
              ]}
            />
            <div className="flex gap-2">
              <Button
                size="sm"
                disabled={!dayOffDate || globalDayOff.isPending}
                onClick={() => globalDayOff.mutate()}
              >
                {t('common.save')}
              </Button>
              <Button size="sm" variant="ghost" onClick={() => setShowDayOff(false)}>
                {t('common.cancel')}
              </Button>
            </div>
          </div>
        </div>
      ) : null}

      <div className="animate-fade-in-up stagger-1">
        <DataTable
          data={rows}
          loading={isLoading}
          emptyMessage={t('common.noResults')}
          onSearch={(q) => {
            setSearch(q)
            setPage(1)
          }}
          searchValue={search}
          searchPlaceholder={t('assignments.search')}
          toolbar={
            <Select
              value={status}
              onChange={(e) => {
                setStatus(e.target.value)
                setPage(1)
              }}
              options={statusOptions}
            />
          }
          pagination={meta}
          onPageChange={setPage}
          columns={[
            {
              key: 'assignment_date',
              header: t('assignments.date'),
              render: (r) => formatDate(r.assignment_date),
            },
            {
              key: 'site',
              header: t('assignments.site'),
              render: (r) => r.site?.name || '—',
            },
            {
              key: 'employee',
              header: t('assignments.employee'),
              render: (r) => r.employee?.full_name || '—',
            },
            {
              key: 'vehicle_registration',
              header: t('assignments.vehicle'),
              render: (r) => r.vehicle_registration || '—',
            },
            {
              key: 'status',
              header: t('common.status'),
              render: (r) => (
                <Badge variant={statusVariant(r.status)}>
                  {t(`assignments.status.${r.status}`, r.status)}
                  {r.is_day_off ? ` · ${t('assignments.dayOff')}` : ''}
                </Badge>
              ),
            },
            {
              key: 'actions',
              header: t('common.actions'),
              className: 'text-right',
              render: (r) => (
                <div className="flex justify-end gap-2">
                  <PermissionGate permission="assignments.manage">
                    <Link
                      href={`/assignments/${r.id}/edit`}
                      className="rounded-lg px-2 py-1 text-xs font-semibold text-accent-600 hover:bg-[var(--premium-hover-bg)] dark:text-accent-400"
                    >
                      {t('common.edit')}
                    </Link>
                    <button
                      type="button"
                      className="rounded-lg px-2 py-1 text-xs font-semibold text-red-500 hover:bg-red-500/10"
                      onClick={() => {
                        if (window.confirm(t('common.confirmDelete'))) remove.mutate(r.id)
                      }}
                    >
                      {t('common.delete')}
                    </button>
                  </PermissionGate>
                </div>
              ),
            },
          ]}
        />
      </div>
    </div>
  )
}
