import React from "react";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Badge } from "@/components/ui/badge";
import { Checkbox } from "@/components/ui/checkbox";
import { 
    Package, 
    CheckCircle2, 
    Scale, 
    Printer,
    Search,
    AlertCircle,
    Truck,
    MapPin
} from "lucide-react";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { usePicking } from "@/hooks/usePicking";
import { toast } from "sonner";

export default function Picking() {
    const {
      selectedCompany,
      shippingCompanies,
      availableSales,
      filteredOrders,
      searchTerm,
      selectedTransport,
      selectedOrder,
      actualWeight,
      isCreatingPicking,
      setSearchTerm,
      setSelectedTransport,
      setSelectedOrder,
      setActualWeight,
      createPickingOrder,
      toggleItem,
      validateWeight,
    } = usePicking();

    const handleValidateWeight = async () => {
      const result = await validateWeight();
      if (result.valid) {
        toast.success(result.message);
      } else {
        toast.error(result.message);
      }
    };

    const handlePrintTicket = (order) => {
        const ticketContent = `
            ================================
            ORDEN DE PICKING
            ================================
            N° Venta: ${order.sale_number}
            Cliente: ${order.customer_name}
            Fecha: ${new Date().toLocaleString('es-CL')}
            ================================
            
            PRODUCTOS A RECOGER:
            ${order.items.map(item => `
            [ ] ${item.name}
                SKU: ${item.sku}
                Cantidad: ${item.quantity}
                Peso: ${item.weight_kg} kg
            `).join('\n')}
            
            ================================
            Peso Total: ${order.total_weight_kg.toFixed(2)} kg
            Embalaje: +${order.packaging_percentage}%
            Peso Esperado: ${order.expected_weight_kg.toFixed(2)} kg
            ================================
            
            Bodegero: _________________
            Hora Inicio: _____________
            Hora Fin: ________________
            ================================
        `;

        const printWindow = window.open('', '', 'width=300,height=600');
        printWindow.document.write(`
            <html>
                <head>
                    <style>
                        body { font-family: monospace; font-size: 12px; }
                        pre { white-space: pre-wrap; }
                    </style>
                </head>
                <body>
                    <pre>${ticketContent}</pre>
                    <script>
                        window.print();
                        window.onafterprint = () => window.close();
                    </script>
                </body>
            </html>
        `);
        printWindow.document.close();
    };

    const getStatusBadge = (status) => {
        const badges = {
            pending: <Badge className="bg-yellow-100 text-yellow-800">Pendiente</Badge>,
            picking: <Badge className="bg-blue-100 text-blue-800">En Picking</Badge>,
            validated: <Badge className="bg-green-100 text-green-800">Validado</Badge>,
            dispatched: <Badge className="bg-gray-100 text-gray-800">Despachado</Badge>
        };
        return badges[status] || badges.pending;
    };

    return (
        <div className="p-6 space-y-6">
            <div className="flex justify-between items-center">
                <div>
                    <h1 className="text-3xl font-bold text-gradient flex items-center gap-2">
                        <Package className="w-8 h-8" />
                        Picking - Preparación de Pedidos
                    </h1>
                    <p className="text-gray-600 mt-1">{selectedCompany?.name}</p>
                </div>
            </div>

            {/* Search and Filter */}
            <div className="grid md:grid-cols-2 gap-4">
                <div className="relative">
                    <Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-5 h-5" />
                    <Input
                        placeholder="Buscar por N° venta o cliente..."
                        value={searchTerm}
                        onChange={(e) => setSearchTerm(e.target.value)}
                        className="pl-10"
                    />
                </div>
                <Select value={selectedTransport} onValueChange={setSelectedTransport}>
                    <SelectTrigger>
                        <SelectValue placeholder="Filtrar por transportista" />
                    </SelectTrigger>
                    <SelectContent>
                        <SelectItem value="all">Todos los transportistas</SelectItem>
                        <SelectItem value="pickup">Retiro en Tienda</SelectItem>
                        {shippingCompanies.map((company) => (
                            <SelectItem key={String(company.id)} value={String(company.id)}>
                                {company.name}
                            </SelectItem>
                        ))}
                    </SelectContent>
                </Select>
            </div>

            {/* Available Sales to Create Picking */}
            {availableSales.length > 0 && (
                <Card className="glass-card border-green-200">
                    <CardHeader>
                        <CardTitle className="text-green-800">
                            Ventas Pendientes de Picking ({availableSales.length})
                        </CardTitle>
                    </CardHeader>
                    <CardContent>
                        <div className="space-y-2">
                            {availableSales.slice(0, 5).map((sale) => (
                                <div key={sale.id} className="flex items-center justify-between p-3 bg-green-50 rounded-lg">
                                    <div>
                                        <p className="font-semibold">Venta #{sale.sale_number}</p>
                                        <p className="text-sm text-gray-600">{sale.customer_name}</p>
                                    </div>
                                    <Button
                                        size="sm"
                                        onClick={() => createPickingOrder(sale)}
                                        className="bg-green-600"
                                        disabled={isCreatingPicking}
                                    >
                                        Crear Picking
                                    </Button>
                                </div>
                            ))}
                        </div>
                    </CardContent>
                </Card>
            )}

            {/* Picking Orders */}
            <div className="grid lg:grid-cols-2 gap-6">
                {filteredOrders.map((order, orderIndex) => (
                    <Card key={order.id} className="glass-card">
                        <CardHeader>
                            <div className="flex justify-between items-start">
                                <div className="flex-1">
                                    <CardTitle className="text-xl">Venta #{order.sale_number}</CardTitle>
                                    <p className="text-sm text-gray-600">{order.customer_name}</p>
                                    
                                    {/* Shipping Info */}
                                    <div className="mt-2 space-y-1">
                                        <div className="flex items-center gap-2">
                                            <Truck className="w-4 h-4 text-blue-600" />
                                            <span className="text-sm font-medium">
                                                {order.shipping_info?.shipping_type === 'pickup' 
                                                    ? 'Retiro en Tienda'
                                                    : order.shipping_info?.shipping_company_name || 'Sin Transporte'}
                                            </span>
                                        </div>
                                        {order.shipping_info?.shipping_type === 'delivery' && order.shipping_info?.shipping_address && (
                                            <div className="flex items-start gap-2">
                                                <MapPin className="w-4 h-4 text-gray-500 mt-0.5" />
                                                <span className="text-xs text-gray-600">
                                                    {order.shipping_info.shipping_address.street_address}, 
                                                    {order.shipping_info.shipping_address.comuna}, 
                                                    {order.shipping_info.shipping_address.region}
                                                </span>
                                            </div>
                                        )}
                                    </div>
                                </div>
                                <div className="flex flex-col items-end gap-2">
                                    {getStatusBadge(order.status)}
                                    <Button
                                        size="sm"
                                        variant="outline"
                                        onClick={() => handlePrintTicket(order)}
                                    >
                                        <Printer className="w-4 h-4 mr-1" />
                                        Ticket
                                    </Button>
                                </div>
                            </div>
                        </CardHeader>
                        <CardContent className="space-y-4">
                            {/* Items Checklist */}
                            <div className="space-y-2">
                                <Label className="font-semibold">Productos a Recoger:</Label>
                                {order.items.map((item, itemIndex) => (
                                    <div key={itemIndex} className="flex items-center gap-3 p-2 bg-gray-50 rounded">
                                        <Checkbox
                                            checked={item.picked}
                                            onCheckedChange={() => toggleItem(orderIndex, itemIndex)}
                                        />
                                        <div className="flex-1">
                                            <p className="font-medium text-sm">{item.name}</p>
                                            <p className="text-xs text-gray-500">
                                                SKU: {item.sku} | Cant: {item.quantity} | {item.weight_kg}kg
                                            </p>
                                        </div>
                                        {item.picked && <CheckCircle2 className="w-5 h-5 text-green-600" />}
                                    </div>
                                ))}
                            </div>

                            {/* Weight Info */}
                            <div className="p-3 bg-blue-50 rounded-lg space-y-2">
                                <div className="flex justify-between text-sm">
                                    <span>Peso Productos:</span>
                                    <span className="font-semibold">{order.total_weight_kg.toFixed(2)} kg</span>
                                </div>
                                <div className="flex justify-between text-sm">
                                    <span>Embalaje (+{order.packaging_percentage}%):</span>
                                    <span className="font-semibold">
                                        {(order.expected_weight_kg - order.total_weight_kg).toFixed(2)} kg
                                    </span>
                                </div>
                                <div className="flex justify-between text-sm border-t pt-2">
                                    <span className="font-semibold">Peso Esperado:</span>
                                    <span className="font-bold text-blue-600">{order.expected_weight_kg.toFixed(2)} kg</span>
                                </div>
                            </div>

                            {/* Weight Validation */}
                            {order.items.every(item => item.picked) && !order.weight_validated && (
                                <div className="space-y-3 p-4 bg-yellow-50 border border-yellow-200 rounded-lg">
                                    <Label className="flex items-center gap-2 font-semibold text-yellow-800">
                                        <Scale className="w-5 h-5" />
                                        Validar Peso del Paquete
                                    </Label>
                                    <Input
                                        type="number"
                                        step="0.01"
                                        placeholder="Ingresa el peso real (kg)"
                                        value={selectedOrder?.id === order.id ? actualWeight : ''}
                                        onChange={(e) => {
                                            setSelectedOrder(order);
                                            setActualWeight(e.target.value);
                                        }}
                                    />
                                    <Button
                                        className="w-full bg-yellow-600"
                                        onClick={handleValidateWeight}
                                        disabled={!actualWeight}
                                    >
                                        <CheckCircle2 className="w-4 h-4 mr-2" />
                                        Validar Peso
                                    </Button>
                                </div>
                            )}

                            {/* Validated */}
                            {order.weight_validated && (
                                <div className="p-3 bg-green-50 border border-green-200 rounded-lg">
                                    <p className="text-sm font-semibold text-green-800 flex items-center gap-2">
                                        <CheckCircle2 className="w-5 h-5" />
                                        Peso Validado: {order.actual_weight_kg} kg
                                    </p>
                                    <p className="text-xs text-green-700 mt-1">
                                        Diferencia: {(order.actual_weight_kg - order.expected_weight_kg).toFixed(2)} kg
                                    </p>
                                </div>
                            )}
                        </CardContent>
                    </Card>
                ))}
            </div>

            {filteredOrders.length === 0 && (
                <Card className="glass-card">
                    <CardContent className="p-12 text-center">
                        <Package className="w-16 h-16 mx-auto mb-4 text-gray-300" />
                        <p className="text-xl text-gray-500">No hay órdenes de picking</p>
                    </CardContent>
                </Card>
            )}
        </div>
    );
}