import React, { useState, useEffect, useCallback } from 'react'
import { useNavigate } from 'react-router-dom'
import { Table, Button, Modal, Form, Input, Select, message, Space, Tag, Card, Row, Col, Statistic } from 'antd'
import { PlusOutlined, EditOutlined, DeleteOutlined, SearchOutlined, SolutionOutlined, BankOutlined } from '@ant-design/icons'
import type { ColumnsType } from 'antd/es/table'
import FileUpload from '../components/FileUpload'
import useFormDraft from '../hooks/useFormDraft'

interface Contact {
  name: string
  position: string
  phone: string
  is_primary?: boolean
}

interface PaymentInfo {
  account_name: string
  bank_account: string
  bank_name: string
  qr_code?: string
  is_primary: boolean
}

interface Subcontractor {
  id: number
  code: string
  name: string
  scope: string
  features: string
  country: string
  contacts: Contact[]
  payment_infos: PaymentInfo[]
  remark: string
  total_contract_amount: number
  total_paid: number
  total_payable: number
  created_at: string
}

const SubcontractorPage: React.FC = () => {
  const navigate = useNavigate()
  const [subcontractors, setSubcontractors] = useState<Subcontractor[]>([])
  const [loading, setLoading] = useState(false)
  const [modalVisible, setModalVisible] = useState(false)
  const [editingSubcontractor, setEditingSubcontractor] = useState<Subcontractor | null>(null)
  const [searchText, setSearchText] = useState('')
  const [form] = Form.useForm()

  // 表单草稿保护
  const { save: saveDraft, restore: restoreDraft, clear: clearDraft, hasDraft } = useFormDraft({
    form,
    storageKey: 'subcontractor_create',
  })

  const handleFormChange = useCallback(() => {
    saveDraft()
  }, [saveDraft])

  const fetchSubcontractors = async () => {
    setLoading(true)
    try {
      const response = await fetch('/api/subcontractors')
      const data = await response.json()
      if (data.success) setSubcontractors(data.data || [])
    } catch (error) {
      message.error('获取分包商列表失败')
    } finally {
      setLoading(false)
    }
  }

  useEffect(() => { fetchSubcontractors() }, [])

  const stats = {
    total: subcontractors.length,
    totalContract: subcontractors.reduce((sum, s) => sum + (s.total_contract_amount || 0), 0),
    totalPayable: subcontractors.reduce((sum, s) => sum + (s.total_payable || 0), 0)
  }

  const getPrimaryContact = (contacts: Contact[]) => {
    const primary = contacts?.find(c => c.is_primary)
    return primary?.name || '-'
  }

  const getPrimaryPaymentInfo = (paymentInfos: PaymentInfo[]) => {
    const primary = paymentInfos?.find(p => p.is_primary)
    return primary
  }

  const columns: ColumnsType<Subcontractor> = [
    {
      title: '名称', dataIndex: 'name', key: 'name',
      render: (text, record) => (
        <Button type="link" style={{ padding: 0, fontWeight: 'bold' }} onClick={() => navigate(`/subcontractors/${record.id}`)}>{text}</Button>
      )
    },
    { title: '承包范围', dataIndex: 'scope', key: 'scope', width: 120 },
    { title: '国家', dataIndex: 'country', key: 'country', width: 80, render: (c) => <Tag>{c || '-'}</Tag> },
    { title: '合同金额', dataIndex: 'total_contract_amount', key: 'total_contract_amount', width: 100, render: (v) => `¥${(v || 0).toLocaleString()}` },
    { title: '应付金额', dataIndex: 'total_payable', key: 'total_payable', width: 100, render: (v) => <span style={{ color: v > 0 ? '#ff4d4f' : '#52c41a' }}>¥{(v || 0).toLocaleString()}</span> },
    { title: '操作', key: 'actions', width: 100, render: (_, record) => (
      <Space>
        <Button type="text" icon={<EditOutlined />} onClick={() => handleEdit(record)} size="small" />
        <Button type="text" danger icon={<DeleteOutlined />} onClick={() => handleDelete(record.id)} size="small" />
      </Space>
    )}
  ]

  const filteredSubcontractors = subcontractors.filter(s =>
    s.code?.toLowerCase().includes(searchText.toLowerCase()) ||
    s.name?.toLowerCase().includes(searchText.toLowerCase()) ||
    s.scope?.toLowerCase().includes(searchText.toLowerCase())
  )

  const handleContactChange = (index: number, field: string, value: any) => {
    form.setFieldsValue({
      contacts: form.getFieldValue('contacts').map((contact: any, i: number) => {
        if (field === 'is_primary' && value) {
          return i === index ? { ...contact, [field]: value } : { ...contact, is_primary: false }
        }
        return i === index ? { ...contact, [field]: value } : contact
      })
    })
  }

  const handlePaymentInfoChange = (index: number, field: string, value: any) => {
    form.setFieldsValue({
      payment_infos: form.getFieldValue('payment_infos').map((info: any, i: number) => {
        if (field === 'is_primary' && value) {
          return i === index ? { ...info, [field]: value } : { ...info, is_primary: false }
        }
        return i === index ? { ...info, [field]: value } : info
      })
    })
  }

  const handleSubmit = async (values: any) => {
    try {
      let contacts = values.contacts || [{ name: '', position: '', phone: '', is_primary: true }]
      const hasPrimary = contacts.some((c: Contact) => c.is_primary)
      if (!hasPrimary && contacts[0].name) contacts[0].is_primary = true
      
      let paymentInfos = values.payment_infos || []
      const hasPrimaryPayment = paymentInfos.some((p: PaymentInfo) => p.is_primary)
      if (!hasPrimaryPayment && paymentInfos.length > 0 && paymentInfos[0].account_name) {
        paymentInfos[0].is_primary = true
      }
      
      const url = editingSubcontractor ? `/api/subcontractors/${editingSubcontractor.id}` : '/api/subcontractors'
      const method = editingSubcontractor ? 'PUT' : 'POST'
      
      const response = await fetch(url, { 
        method, 
        headers: { 'Content-Type': 'application/json' }, 
        body: JSON.stringify({ ...values, contacts, payment_infos: paymentInfos }) 
      })
      const data = await response.json()
      if (data.success) {
        message.success(editingSubcontractor ? '更新成功' : '创建成功')
        clearDraft()
        setModalVisible(false)
        form.resetFields()
        setEditingSubcontractor(null)
        fetchSubcontractors()
      } else {
        message.error(data.message || '操作失败')
      }
    } catch (error) {
      message.error('操作失败')
    }
  }

  const handleEdit = (subcontractor: Subcontractor) => {
    setEditingSubcontractor(subcontractor)
    form.setFieldsValue({
      name: subcontractor.name, 
      scope: subcontractor.scope, 
      features: subcontractor.features, 
      country: subcontractor.country, 
      remark: subcontractor.remark,
      contacts: subcontractor.contacts?.length ? subcontractor.contacts : [{ name: '', position: '', phone: '', is_primary: true }],
      payment_infos: subcontractor.payment_infos?.length ? subcontractor.payment_infos : []
    })
    setModalVisible(true)
  }

  const handleDelete = async (id: number) => {
    Modal.confirm({
      title: '确认删除', content: '确定要删除此分包商吗？', okText: '确定', cancelText: '取消',
      onOk: async () => {
        try {
          const response = await fetch(`/api/subcontractors/${id}`, { method: 'DELETE' })
          const data = await response.json()
          if (data.success) { message.success('删除成功'); fetchSubcontractors() }
          else message.error(data.message || '删除失败')
        } catch (error) { message.error('删除失败') }
      }
    })
  }

  const handleAdd = () => {
    setEditingSubcontractor(null)
    form.resetFields()
    form.setFieldsValue({ 
      country: 'Laos', 
      contacts: [{ name: '', position: '', phone: '', is_primary: true }],
      payment_infos: []
    })
    setModalVisible(true)
    // 检查是否有草稿，提示用户是否恢复
    setTimeout(() => {
      if (hasDraft()) {
        Modal.confirm({
          title: '发现未完成的草稿',
          content: '检测到上次未提交的分包商信息，是否恢复？',
          okText: '恢复草稿',
          cancelText: '重新填写',
          onOk: () => {
            restoreDraft()
          },
          onCancel: () => {
            clearDraft()
            form.resetFields()
            form.setFieldsValue({ 
              country: 'Laos', 
              contacts: [{ name: '', position: '', phone: '', is_primary: true }],
              payment_infos: []
            })
          },
        })
      }
    }, 0)
  }

  return (
    <div style={{ padding: 24 }}>
      <Row gutter={16} style={{ marginBottom: 24 }}>
        <Col span={8}><Card><Statistic title="分包商总数" value={stats.total} prefix={<SolutionOutlined />} /></Card></Col>
        <Col span={8}><Card><Statistic title="合同总金额" value={stats.totalContract} prefix="¥" valueStyle={{ color: '#1890ff' }} /></Card></Col>
        <Col span={8}><Card><Statistic title="应付总金额" value={stats.totalPayable} prefix="¥" valueStyle={{ color: stats.totalPayable > 0 ? '#ff4d4f' : '#52c41a' }} /></Card></Col>
      </Row>

      <Card style={{ marginBottom: 16 }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
          <Input placeholder="搜索分包商编号、名称或承包范围" prefix={<SearchOutlined />} value={searchText} onChange={(e) => setSearchText(e.target.value)} allowClear style={{ width: 350 }} />
          <Button type="primary" icon={<PlusOutlined />} onClick={handleAdd}>新增分包商</Button>
        </div>
      </Card>

      <Card>
        <Table columns={columns} dataSource={filteredSubcontractors} rowKey="id" loading={loading} pagination={{ pageSize: 10, showTotal: (total) => `共 ${total} 条` }} scroll={{ x: 1100 }} />
      </Card>

      <Modal 
        title={editingSubcontractor ? '编辑分包商' : '新增分包商'} 
        open={modalVisible} 
        onCancel={() => {
          if (form.isFieldsTouched()) {
            Modal.confirm({
              title: '确认关闭',
              content: '表单数据尚未保存，关闭后可通过草稿恢复。确定关闭吗？',
              okText: '关闭',
              cancelText: '继续编辑',
              onOk: () => {
                saveDraft()
                setModalVisible(false)
                form.resetFields()
                setEditingSubcontractor(null)
              },
            })
          } else {
            setModalVisible(false)
            form.resetFields()
            setEditingSubcontractor(null)
          }
        }} 
        onOk={() => form.submit()} 
        width={800}
        maskClosable={false}
      >
        <Form form={form} layout="vertical" onFinish={handleSubmit} onValuesChange={handleFormChange}>
          <Form.Item name="name" label="名称" rules={[{ required: true, message: '请输入名称' }]}>
            <Input placeholder="分包商名称" />
          </Form.Item>
          <Row gutter={16}>
            <Col span={12}>
              <Form.Item name="scope" label="承包范围">
                <Input placeholder="手填：如电力安装、土建工程" />
              </Form.Item>
            </Col>
            <Col span={12}>
              <Form.Item name="country" label="国家" initialValue="Laos">
                <Select>
                  <Select.Option value="China">中国</Select.Option>
                  <Select.Option value="Laos">老挝</Select.Option>
                </Select>
              </Form.Item>
            </Col>
          </Row>
          <Form.Item name="features" label="特点">
            <Input.TextArea rows={2} placeholder="手填：如专业团队、设备齐全、价格合理等" />
          </Form.Item>
          <Form.Item name="remark" label="备注">
            <Input.TextArea rows={2} placeholder="备注信息" />
          </Form.Item>
          
          <h4>联系人</h4>
          <Form.List name="contacts" initialValue={[{ name: '', position: '', phone: '', is_primary: true }]}>
            {(fields, { add, remove }) => (
              <div>
                {fields.map(({ key, name, ...restField }) => (
                  <div key={key} style={{ display: 'flex', gap: 8, marginBottom: 8, alignItems: 'center' }}>
                    <Form.Item {...restField} name={[name, 'name']} style={{ marginBottom: 0, flex: 1 }}>
                      <Input placeholder="姓名" />
                    </Form.Item>
                    <Form.Item {...restField} name={[name, 'position']} style={{ marginBottom: 0, flex: 1 }}>
                      <Input placeholder="职位" />
                    </Form.Item>
                    <Form.Item {...restField} name={[name, 'phone']} style={{ marginBottom: 0, flex: 1 }}>
                      <Input placeholder="电话" />
                    </Form.Item>
                    <div style={{ display: 'flex', alignItems: 'center' }}>
                      <Form.Item {...restField} name={[name, 'is_primary']} valuePropName="checked" style={{ marginBottom: 0, marginRight: 8 }}>
                        <input 
                          type="checkbox" 
                          onChange={(e) => handleContactChange(name, 'is_primary', e.target.checked)}
                        />
                      </Form.Item>
                      <span>主联系人</span>
                    </div>
                    {fields.length > 1 && <Button type="link" danger onClick={() => remove(name)}>删除</Button>}
                  </div>
                ))}
                <Button type="dashed" onClick={() => add()} style={{ width: '100%' }}>+ 添加联系人</Button>
              </div>
            )}
          </Form.List>

          <h4 style={{ marginTop: 24 }}>收款信息</h4>
          <Form.List name="payment_infos" initialValue={[]}>
            {(fields, { add, remove }) => (
              <div>
                {fields.map(({ key, name, ...restField }) => (
                  <div key={key} style={{ border: '1px solid #e8e8e8', padding: 16, marginBottom: 16, borderRadius: 4, backgroundColor: '#fafafa' }}>
                    <div style={{ display: 'flex', gap: 8, marginBottom: 8, alignItems: 'center' }}>
                      <Form.Item {...restField} name={[name, 'account_name']} label="收款户名" style={{ marginBottom: 0, flex: 1 }}>
                        <Input placeholder="收款户名" />
                      </Form.Item>
                      <Form.Item {...restField} name={[name, 'bank_name']} label="开户银行" style={{ marginBottom: 0, flex: 1 }}>
                        <Input placeholder="开户银行" />
                      </Form.Item>
                    </div>
                    <div style={{ display: 'flex', gap: 8, marginBottom: 8, alignItems: 'center' }}>
                      <Form.Item {...restField} name={[name, 'bank_account']} label="银行账号" style={{ marginBottom: 0, flex: 1 }}>
                        <Input placeholder="银行账号" />
                      </Form.Item>
                      <div style={{ display: 'flex', alignItems: 'center', marginTop: 30 }}>
                        <Form.Item {...restField} name={[name, 'is_primary']} valuePropName="checked" style={{ marginBottom: 0, marginRight: 8 }}>
                          <input 
                            type="checkbox" 
                            onChange={(e) => handlePaymentInfoChange(name, 'is_primary', e.target.checked)}
                          />
                        </Form.Item>
                        <span>主要收款账户</span>
                      </div>
                    </div>
                    <Form.Item {...restField} name={[name, 'qr_code']} label="收款码" style={{ marginBottom: 0 }}>
                      <FileUpload maxCount={1} accept="image/*" />
                    </Form.Item>
                    {fields.length > 0 && (
                      <Button type="link" danger onClick={() => remove(name)} style={{ marginTop: 8 }}>删除此收款信息</Button>
                    )}
                  </div>
                ))}
                <Button type="dashed" onClick={() => add({ account_name: '', bank_account: '', bank_name: '', is_primary: false })} style={{ width: '100%' }}>
                  + 添加收款信息
                </Button>
              </div>
            )}
          </Form.List>
        </Form>
      </Modal>
    </div>
  )
}

export default SubcontractorPage
