import type { FC } from 'react';
import { useState } from 'react';
import { Download, Mail, Star, Tag } from 'lucide-react';
import { Card, Button, toast } from '../ui';
import { odooApi, type Patient } from '../../services/odoo';
import { exportToExcel } from '../../lib/exporter';

const PAGE_SIZE = 200;

const ExportarReport: FC = () => {
  const [descargando, setDescargando] = useState<string | null>(null);

  const fetchAllPatients = async (): Promise<Patient[]> => {
    const all: Patient[] = [];
    let page = 1;
    let totalPages = 1;
    do {
      const res = await odooApi.getPatients({ page, page_size: PAGE_SIZE });
      if (res.status !== 'success') break;
      all.push(...res.patients);
      totalPages = res.total_pages || 1;
      page += 1;
    } while (page <= totalPages);
    return all;
  };

  const exportCorreos = async (soloVip: boolean) => {
    const key = soloVip ? 'vip' : 'correos';
    try {
      setDescargando(key);
      const pacientes = await fetchAllPatients();
      const filtrados = pacientes
        .filter((p) => p.email && (!soloVip || p.is_vip))
        .sort((a, b) => a.name.localeCompare(b.name));
      if (filtrados.length === 0) {
        toast.error('No hay pacientes con email' + (soloVip ? ' VIP' : ''));
        return;
      }
      await exportToExcel({
        filename: `${soloVip ? 'correos-vip' : 'correos'}-skeen-${new Date().toISOString().split('T')[0]}`,
        sheetName: soloVip ? 'Correos VIP' : 'Correos',
        title: soloVip ? 'Correos de pacientes VIP' : 'Correos de pacientes',
        subtitle: `${filtrados.length} correos`,
        columns: [
          { header: 'Nombre', key: 'name' },
          { header: 'Email', key: 'email' },
          { header: 'Teléfono', key: 'phone' },
        ],
        rows: filtrados.map((p) => ({ name: p.name, email: p.email, phone: p.phone })),
      });
      toast.success(`Excel descargado (${filtrados.length} correos)`);
    } catch (err) {
      toast.error('Error al exportar correos');
      console.error(err);
    } finally {
      setDescargando(null);
    }
  };

  const exportPrecios = async () => {
    try {
      setDescargando('precios');
      const rows: Record<string, unknown>[] = [];
      let page = 1;
      let totalPages = 1;
      do {
        const res = await odooApi.getServices({ page, page_size: PAGE_SIZE });
        if (res.status !== 'success') break;
        res.services.forEach((s) => rows.push({
          code: s.code, name: s.name, category: s.category, price: s.price,
          package_price: s.package_price || 0, package_sessions: s.package_sessions || 0,
        }));
        totalPages = res.total_pages || 1;
        page += 1;
      } while (page <= totalPages);
      await exportToExcel({
        filename: `lista-precios-skeen-${new Date().toISOString().split('T')[0]}`,
        sheetName: 'Lista de precios',
        title: 'Lista de precios de servicios',
        subtitle: `${rows.length} servicios activos`,
        columns: [
          { header: 'Código', key: 'code' },
          { header: 'Nombre', key: 'name' },
          { header: 'Categoría', key: 'category' },
          { header: 'Precio', key: 'price', format: 'currency' },
          { header: 'Precio paquete', key: 'package_price', format: 'currency' },
          { header: 'Sesiones paquete', key: 'package_sessions', format: 'number' },
        ],
        rows,
      });
      toast.success(`Excel descargado (${rows.length} servicios)`);
    } catch (err) {
      toast.error('Error al exportar lista de precios');
      console.error(err);
    } finally {
      setDescargando(null);
    }
  };

  const cards = [
    {
      key: 'correos',
      icon: Mail,
      titulo: 'Exportar correos',
      descripcion: 'Todos los pacientes con email registrado (nombre, email, teléfono).',
      onClick: () => exportCorreos(false),
    },
    {
      key: 'vip',
      icon: Star,
      titulo: 'Correos VIP',
      descripcion: 'Solo pacientes marcados como VIP con email registrado.',
      onClick: () => exportCorreos(true),
    },
    {
      key: 'precios',
      icon: Tag,
      titulo: 'Lista de precios',
      descripcion: 'Servicios activos con código, categoría, precio y precio de paquete.',
      onClick: exportPrecios,
    },
  ];

  return (
    <div className="grid grid-cols-1 md:grid-cols-3 gap-4 sm:gap-6">
      {cards.map(({ key, icon: Icon, titulo, descripcion, onClick }) => (
        <Card key={key}>
          <Card.Body>
            <div className="flex flex-col items-start gap-3">
              <div className="w-10 h-10 rounded-full bg-theme-accent-bg flex items-center justify-center text-theme-heading">
                <Icon size={20} />
              </div>
              <div>
                <h3 className="font-heading text-lg text-theme-heading">{titulo}</h3>
                <p className="text-sm text-theme-muted mt-1">{descripcion}</p>
              </div>
              <Button onClick={onClick} loading={descargando === key} disabled={!!descargando}>
                <Download size={16} className="mr-2" />
                Descargar CSV
              </Button>
            </div>
          </Card.Body>
        </Card>
      ))}
    </div>
  );
};

export default ExportarReport;
