import React, { useState, useEffect, useCallback } from 'react'
import { useNavigate } from 'react-router-dom'
import { Table, Button, Modal, Form, Input, message, Space, Tag, Card, Row, Col, Statistic, Image } from 'antd'
import { PlusOutlined, EditOutlined, DeleteOutlined, SearchOutlined, HomeOutlined, 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 Customer {
  id: number
  code: string
  name: string
  address: string
  contacts: Contact[]
  payment_infos: PaymentInfo[]
  remark: string
  total_contract_amount: number
  total_received: number
  total_receivable: number
  created_at: string
}

const CustomerPage: React.FC = () => {
  const navigate = useNavigate()
  const [customers, setCustomers] = useState<Customer[]>([])
  const [loading, setLoading] = useState(false)
  const [modalVisible, setModalVisible] = useState(false)
  const [editingCustomer, setEditingCustomer] = useState<Customer | null>(null)
  const [searchText, setSearchText] = useState('')
  const [form] = Form.useForm()

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

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

  const fetchCustomers = async () => {
    setLoading(true)
    try {
      const response = await fetch('/api/customers')
      const data = await response.json()
      if (data.success) setCustomers(data.data || [])
    } catch (error) {
      message.error('获取客户列表失败')
    } finally {
      setLoading(false)
    }
  }

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

  const stats = {
    total: customers.length,
    totalContract: customers.reduce((sum, c) => sum + (c.total_contract_amount || 0), 0),
    totalReceivable: customers.reduce((sum, c) => sum + (c.total_receivable || 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<Customer> = [
    {
      title: '名称', dataIndex: 'name', key: 'name',
      render: (text, record) => (
        <Button type="link" style={{ padding: 0, fontWeight: 'bold' }} onClick={() => navigate(`/customers/${record.id}`)}>{text}</Button>
      )
    },
    { title: '地址', dataIndex: 'address', key: 'address', width: 150, render: (t) => t || '-' },
    { title: '主联系人', key: 'primary_contact', width: 100, render: (_, record) => getPrimaryContact(record.contacts || []) },
    { 
      title: '收款信息', 
      key: 'payment_info', 
      width: 200,
      render: (_, record) => {
        const primary = getPrimaryPaymentInfo(record.payment_infos || [])
        if (!primary) return <Tag>未设置</Tag>
        return (
          <div style={{ fontSize: 12 }}>
            <div><BankOutlined /> {primary.bank_name || '-'}</div>
            <div>户名: {primary.account_name || '-'}</div>
            <div>账号: {primary.bank_account ? primary.bank_account.slice(-4).padStart(primary.bank_account.length, '*') : '-'}</div>
          </div>
        )
      }
    },
    { title: '合同金额', dataIndex: 'total_contract_amount', key: 'total_contract_amount', width: 100, render: (v) => `¥${(v || 0).toLocaleString()}` },
    { title: '应收金额', dataIndex: 'total_receivable', key: 'total_receivable', 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 filteredCustomers = customers.filter(c =>
    c.code?.toLowerCase().includes(searchText.toLowerCase()) ||
    c.name?.toLowerCase().includes(searchText.toLowerCase()) ||
    c.address?.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 = editingCustomer ? `/api/customers/${editingCustomer.id}` : '/api/customers'
      const method = editingCustomer ? '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(editingCustomer ? '更新成功' : '创建成功')
        clearDraft()
        setModalVisible(false)
        form.resetFields()
        setEditingCustomer(null)
        fetchCustomers()
      } else {
        message.error(data.message || '操作失败')
      }
    } catch (error) {
      message.error('操作失败')
    }
  }

  const handleEdit = (customer: Customer) => {
    setEditingCustomer(customer)
    form.setFieldsValue({
      name: customer.name, 
      address: customer.address, 
      remark: customer.remark,
      contacts: customer.contacts?.length ? customer.contacts : [{ name: '', position: '', phone: '', is_primary: true }],
      payment_infos: customer.payment_infos?.length ? customer.payment_infos : []
    })
    setModalVisible(true)
  }

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

  const handleAdd = () => {
    setEditingCustomer(null)
    form.resetFields()
    form.setFieldsValue({ 
      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({ 
              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={<HomeOutlined />} /></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.totalReceivable} prefix="¥" valueStyle={{ color: stats.totalReceivable > 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={filteredCustomers} rowKey="id" loading={loading} pagination={{ pageSize: 10, showTotal: (total) => `共 ${total} 条` }} scroll={{ x: 1100 }} />
      </Card>

      <Modal 
        title={editingCustomer ? '编辑客户' : '新增客户'} 
        open={modalVisible} 
        onCancel={() => {
          if (form.isFieldsTouched()) {
            Modal.confirm({
              title: '确认关闭',
              content: '表单数据尚未保存，关闭后可通过草稿恢复。确定关闭吗？',
              okText: '关闭',
              cancelText: '继续编辑',
              onOk: () => {
                saveDraft()
                setModalVisible(false)
                form.resetFields()
                setEditingCustomer(null)
              },
            })
          } else {
            setModalVisible(false)
            form.resetFields()
            setEditingCustomer(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>
          <Form.Item name="address" label="地址">
            <Input 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 CustomerPage
