'use client';

import React, { useState, useEffect } from 'react';
import MainLayout from '@/components/layout/MainLayout';

type OrderLine = {
  id: string;
  trackingNumber?: string | null;
  airwayBill?: string | null;
  status: string;
  quantity: number;
  product: { code: string; name: string };
  farm?: { name: string } | null;
  order: {
    id: string;
    po: string;
    orderNumber: string;
    deliveryDate: string;
    shippingCustomer?: { businessName: string } | null;
  };
};

export default function AsignarTrackingPage() {
  const [lines, setLines] = useState<OrderLine[]>([]);
  const [loading, setLoading] = useState(true);
  const [search, setSearch] = useState('');
  const [bulkText, setBulkText] = useState('');
  const [awb, setAwb] = useState('');
  const [editMap, setEditMap] = useState<Record<string, { trackingNumber: string; airwayBill: string }>>({});
  const [saving, setSaving] = useState(false);
  const [result, setResult] = useState<{ succeeded: number; failed: number } | null>(null);
  const [filterStatus, setFilterStatus] = useState<'ALL' | 'PENDING' | 'SHIPPED'>('PENDING');

  const fetchOrders = async () => {
    setLoading(true);
    try {
      const res = await fetch('/api/orders');
      if (!res.ok) return;
      const orders = await res.json();
      const flat: OrderLine[] = [];
      for (const o of orders) {
        for (const l of o.lines) {
          flat.push({ ...l, order: { id: o.id, po: o.po, orderNumber: o.orderNumber, deliveryDate: o.deliveryDate, shippingCustomer: o.shippingCustomer } });
        }
      }
      setLines(flat);
      // Initialize edit map
      const map: Record<string, { trackingNumber: string; airwayBill: string }> = {};
      flat.forEach(l => { map[l.id] = { trackingNumber: l.trackingNumber || '', airwayBill: l.airwayBill || '' }; });
      setEditMap(map);
    } catch {}
    setLoading(false);
  };

  useEffect(() => { fetchOrders(); }, []);

  const filtered = lines.filter(l => {
    const s = search.toLowerCase();
    const matchSearch = !s || l.order.po.toLowerCase().includes(s) || l.order.orderNumber.toLowerCase().includes(s) ||
      (l.order.shippingCustomer?.businessName || '').toLowerCase().includes(s) ||
      l.product.code.toLowerCase().includes(s) || (l.trackingNumber || '').toLowerCase().includes(s);
    const matchStatus = filterStatus === 'ALL' || l.status === filterStatus || (filterStatus === 'PENDING' && l.status === 'PENDING');
    return matchSearch && matchStatus;
  });

  // Apply AWB to all visible lines
  const applyAwbToAll = () => {
    const newMap = { ...editMap };
    filtered.forEach(l => { newMap[l.id] = { ...newMap[l.id], airwayBill: awb }; });
    setEditMap(newMap);
  };

  // Parse bulk text (one tracking per line) and assign to lines without tracking
  const parseBulkAndAssign = () => {
    const trackings = bulkText.split('\n').map(t => t.trim()).filter(Boolean);
    const pendingLines = filtered.filter(l => !editMap[l.id]?.trackingNumber);
    const newMap = { ...editMap };
    pendingLines.forEach((l, i) => {
      if (trackings[i]) {
        newMap[l.id] = { ...newMap[l.id], trackingNumber: trackings[i] };
      }
    });
    setEditMap(newMap);
    setBulkText('');
  };

  const handleSave = async () => {
    setSaving(true);
    setResult(null);
    const toUpdate = Object.entries(editMap)
      .filter(([, v]) => v.trackingNumber || v.airwayBill)
      .map(([lineId, v]) => ({ lineId, trackingNumber: v.trackingNumber, airwayBill: v.airwayBill }));

    if (toUpdate.length === 0) { alert('No hay trackings para guardar.'); setSaving(false); return; }

    const res = await fetch('/api/orders/assign-tracking', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ lines: toUpdate }),
    });
    const data = await res.json();
    setResult(data);
    await fetchOrders();
    setSaving(false);
  };

  const statusBadge = (s: string) => {
    const map: Record<string, { bg: string; color: string; label: string }> = {
      PENDING: { bg: '#fef9c3', color: '#854d0e', label: 'Pendiente' },
      SHIPPED: { bg: '#d1fae5', color: '#065f46', label: 'Enviado' },
      DELIVERED: { bg: '#dbeafe', color: '#1e40af', label: 'Entregado' },
    };
    const style = map[s] || { bg: '#f3f4f6', color: '#374151', label: s };
    return <span style={{ background: style.bg, color: style.color, padding: '0.2rem 0.6rem', borderRadius: '12px', fontSize: '0.75rem', fontWeight: 600 }}>{style.label}</span>;
  };

  return (
    <MainLayout>
      <div style={{ padding: '2rem', maxWidth: '1200px', margin: '0 auto' }}>
        <div style={{ marginBottom: '1.5rem' }}>
          <h1 style={{ margin: 0, fontSize: '1.6rem', fontWeight: 700, color: '#1a1a2e' }}>📦 Asignar Trackings</h1>
          <p style={{ margin: '0.25rem 0 0', color: '#666', fontSize: '0.9rem' }}>Asigna números de tracking y AWB a las líneas de órdenes</p>
        </div>

        {/* Top controls */}
        <div style={{ background: '#fff', borderRadius: '12px', padding: '1.25rem', boxShadow: '0 2px 8px rgba(0,0,0,0.07)', marginBottom: '1.25rem', display: 'flex', flexWrap: 'wrap', gap: '1rem', alignItems: 'flex-end' }}>
          <div style={{ flex: '1 1 220px' }}>
            <label style={{ display: 'block', fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.4rem', color: '#555' }}>Buscar</label>
            <input value={search} onChange={e => setSearch(e.target.value)} placeholder="PO, orden, cliente, tracking..."
              style={{ width: '100%', padding: '0.55rem 0.8rem', border: '1px solid #ddd', borderRadius: '8px', boxSizing: 'border-box', fontSize: '0.9rem' }} />
          </div>
          <div>
            <label style={{ display: 'block', fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.4rem', color: '#555' }}>Estado</label>
            <select value={filterStatus} onChange={e => setFilterStatus(e.target.value as any)}
              style={{ padding: '0.55rem 0.8rem', border: '1px solid #ddd', borderRadius: '8px', fontSize: '0.9rem' }}>
              <option value="PENDING">Pendientes</option>
              <option value="SHIPPED">Enviados</option>
              <option value="ALL">Todos</option>
            </select>
          </div>
          <div style={{ flex: '1 1 200px' }}>
            <label style={{ display: 'block', fontSize: '0.8rem', fontWeight: 600, marginBottom: '0.4rem', color: '#555' }}>AWB / Guía Master (aplicar a todos)</label>
            <div style={{ display: 'flex', gap: '0.5rem' }}>
              <input value={awb} onChange={e => setAwb(e.target.value)} placeholder="123-45678901"
                style={{ flex: 1, padding: '0.55rem 0.8rem', border: '1px solid #ddd', borderRadius: '8px', fontSize: '0.9rem' }} />
              <button onClick={applyAwbToAll} style={{ padding: '0.55rem 1rem', borderRadius: '8px', border: 'none', background: '#667eea', color: '#fff', cursor: 'pointer', fontSize: '0.85rem', whiteSpace: 'nowrap' }}>
                Aplicar a todos
              </button>
            </div>
          </div>
        </div>

        {/* Bulk tracking input */}
        <div style={{ background: '#fff', borderRadius: '12px', padding: '1.25rem', boxShadow: '0 2px 8px rgba(0,0,0,0.07)', marginBottom: '1.25rem' }}>
          <label style={{ display: 'block', fontSize: '0.85rem', fontWeight: 600, marginBottom: '0.5rem', color: '#555' }}>
            📋 Pegar lista de trackings (uno por línea — se asignarán en orden a las líneas pendientes)
          </label>
          <div style={{ display: 'flex', gap: '0.75rem', alignItems: 'flex-start' }}>
            <textarea value={bulkText} onChange={e => setBulkText(e.target.value)} rows={4} placeholder={"1Z999AA10123456784\n1Z999AA10123456785\n1Z999AA10123456786"}
              style={{ flex: 1, padding: '0.6rem 0.8rem', border: '1px solid #ddd', borderRadius: '8px', fontSize: '0.85rem', fontFamily: 'monospace', resize: 'vertical' }} />
            <button onClick={parseBulkAndAssign} disabled={!bulkText.trim()}
              style={{ padding: '0.6rem 1.2rem', borderRadius: '8px', border: 'none', background: '#10b981', color: '#fff', cursor: 'pointer', fontWeight: 600, fontSize: '0.85rem', whiteSpace: 'nowrap' }}>
              Asignar Lista
            </button>
          </div>
        </div>

        {result && (
          <div style={{ background: '#d1fae5', border: '1px solid #6ee7b7', borderRadius: '8px', padding: '0.75rem 1rem', marginBottom: '1rem', color: '#065f46', fontSize: '0.9rem' }}>
            ✅ {result.succeeded} trackings guardados exitosamente{result.failed > 0 ? ` — ${result.failed} con errores` : ''}.
          </div>
        )}

        {/* Table */}
        <div style={{ background: '#fff', borderRadius: '12px', boxShadow: '0 2px 12px rgba(0,0,0,0.08)', overflow: 'auto' }}>
          <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '0.85rem', minWidth: '900px' }}>
            <thead>
              <tr style={{ background: 'linear-gradient(135deg, #667eea, #764ba2)', color: '#fff' }}>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'left' }}>PO / Orden</th>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'left' }}>Cliente</th>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'left' }}>Producto</th>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'left' }}>Finca</th>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'center' }}>Estado</th>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'left' }}>Tracking</th>
                <th style={{ padding: '0.75rem 0.8rem', textAlign: 'left' }}>AWB</th>
              </tr>
            </thead>
            <tbody>
              {loading ? (
                <tr><td colSpan={7} style={{ textAlign: 'center', padding: '2rem', color: '#999' }}>Cargando...</td></tr>
              ) : filtered.length === 0 ? (
                <tr><td colSpan={7} style={{ textAlign: 'center', padding: '2rem', color: '#999' }}>No hay líneas que coincidan.</td></tr>
              ) : filtered.map((line, i) => (
                <tr key={line.id} style={{ background: i % 2 === 0 ? '#fff' : '#f8f9fa', borderBottom: '1px solid #eee' }}>
                  <td style={{ padding: '0.65rem 0.8rem', fontWeight: 600 }}>
                    <div style={{ color: '#667eea' }}>{line.order.po}</div>
                    <div style={{ color: '#999', fontSize: '0.78rem' }}>{line.order.orderNumber}</div>
                  </td>
                  <td style={{ padding: '0.65rem 0.8rem', maxWidth: '150px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
                    {line.order.shippingCustomer?.businessName || '—'}
                  </td>
                  <td style={{ padding: '0.65rem 0.8rem' }}>
                    <span style={{ fontWeight: 600 }}>{line.product.code}</span>
                  </td>
                  <td style={{ padding: '0.65rem 0.8rem', color: '#666' }}>{line.farm?.name || '—'}</td>
                  <td style={{ padding: '0.65rem 0.8rem', textAlign: 'center' }}>{statusBadge(line.status)}</td>
                  <td style={{ padding: '0.5rem 0.8rem' }}>
                    <input
                      value={editMap[line.id]?.trackingNumber || ''}
                      onChange={e => setEditMap(m => ({ ...m, [line.id]: { ...m[line.id], trackingNumber: e.target.value } }))}
                      placeholder="Tracking..."
                      style={{ width: '100%', padding: '0.35rem 0.5rem', border: '1px solid #ddd', borderRadius: '6px', fontSize: '0.82rem', boxSizing: 'border-box' }}
                    />
                  </td>
                  <td style={{ padding: '0.5rem 0.8rem' }}>
                    <input
                      value={editMap[line.id]?.airwayBill || ''}
                      onChange={e => setEditMap(m => ({ ...m, [line.id]: { ...m[line.id], airwayBill: e.target.value } }))}
                      placeholder="AWB..."
                      style={{ width: '100%', padding: '0.35rem 0.5rem', border: '1px solid #ddd', borderRadius: '6px', fontSize: '0.82rem', boxSizing: 'border-box' }}
                    />
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>

        <div style={{ marginTop: '1.25rem', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
          <p style={{ color: '#999', fontSize: '0.85rem', margin: 0 }}>{filtered.length} líneas</p>
          <button onClick={handleSave} disabled={saving}
            style={{ padding: '0.7rem 2rem', borderRadius: '10px', border: 'none', background: 'linear-gradient(135deg, #10b981, #059669)', color: '#fff', cursor: 'pointer', fontWeight: 700, fontSize: '1rem', boxShadow: '0 4px 12px rgba(16,185,129,0.3)' }}>
            {saving ? '⏳ Guardando...' : '💾 Guardar Trackings'}
          </button>
        </div>
      </div>
    </MainLayout>
  );
}
