import type { Pool } from 'pg';
import type { EventoFiscal, EventoCreate, EventoUpdate } from '@horux/shared';

/**
 * Obtiene recordatorios visibles para el usuario.
 * - Públicos: todos los del tenant
 * - Privados: solo los creados por el usuario
 */
export async function getRecordatorios(
  pool: Pool,
  userId: string,
  año: number
): Promise<EventoFiscal[]> {
  const { rows } = await pool.query(`
    SELECT id, titulo, descripcion, fecha_limite as "fechaLimite",
           notas, completado, privado, creado_por as "creadoPor",
           created_at as "createdAt"
    FROM recordatorios
    WHERE EXTRACT(YEAR FROM fecha_limite) = $1
      AND (privado = false OR creado_por = $2)
    ORDER BY fecha_limite
  `, [año, userId]);

  return rows.map(r => ({
    id: r.id,
    titulo: r.titulo,
    descripcion: r.descripcion || '',
    tipo: 'custom' as const,
    fechaLimite: r.fechaLimite instanceof Date
      ? r.fechaLimite.toISOString().split('T')[0]
      : String(r.fechaLimite).split('T')[0],
    recurrencia: 'unica' as const,
    completado: r.completado,
    notas: r.notas,
    privado: r.privado,
    creadoPor: r.creadoPor,
    createdAt: r.createdAt?.toISOString(),
  }));
}

export async function createRecordatorio(
  pool: Pool,
  userId: string,
  data: EventoCreate & { privado?: boolean }
): Promise<EventoFiscal> {
  const { rows } = await pool.query(`
    INSERT INTO recordatorios (titulo, descripcion, fecha_limite, notas, privado, creado_por)
    VALUES ($1, $2, $3, $4, $5, $6)
    RETURNING id, titulo, descripcion, fecha_limite as "fechaLimite",
              notas, completado, privado, creado_por as "creadoPor",
              created_at as "createdAt"
  `, [
    data.titulo,
    data.descripcion || null,
    data.fechaLimite,
    data.notas || null,
    data.privado ?? false,
    userId,
  ]);

  const r = rows[0];
  return {
    id: r.id,
    titulo: r.titulo,
    descripcion: r.descripcion || '',
    tipo: 'custom',
    fechaLimite: r.fechaLimite instanceof Date
      ? r.fechaLimite.toISOString().split('T')[0]
      : String(r.fechaLimite).split('T')[0],
    recurrencia: 'unica',
    completado: r.completado,
    notas: r.notas,
    createdAt: r.createdAt?.toISOString(),
  };
}

export async function updateRecordatorio(
  pool: Pool,
  userId: string,
  id: number,
  data: EventoUpdate & { privado?: boolean }
): Promise<EventoFiscal | null> {
  // Verify ownership or public
  const { rows: existing } = await pool.query(
    `SELECT id, creado_por FROM recordatorios WHERE id = $1`,
    [id]
  );

  if (existing.length === 0) return null;

  const sets: string[] = [];
  const params: any[] = [];
  let idx = 1;

  if (data.titulo !== undefined) { sets.push(`titulo = $${idx++}`); params.push(data.titulo); }
  if (data.descripcion !== undefined) { sets.push(`descripcion = $${idx++}`); params.push(data.descripcion); }
  if (data.fechaLimite !== undefined) { sets.push(`fecha_limite = $${idx++}`); params.push(data.fechaLimite); }
  if (data.completado !== undefined) { sets.push(`completado = $${idx++}`); params.push(data.completado); }
  if (data.notas !== undefined) { sets.push(`notas = $${idx++}`); params.push(data.notas); }
  if (data.privado !== undefined) { sets.push(`privado = $${idx++}`); params.push(data.privado); }

  if (sets.length === 0) return null;

  sets.push(`updated_at = NOW()`);
  params.push(id);

  const { rows } = await pool.query(`
    UPDATE recordatorios SET ${sets.join(', ')}
    WHERE id = $${idx}
    RETURNING id, titulo, descripcion, fecha_limite as "fechaLimite",
              notas, completado, privado, creado_por as "creadoPor",
              created_at as "createdAt"
  `, params);

  if (rows.length === 0) return null;

  const r = rows[0];
  return {
    id: r.id,
    titulo: r.titulo,
    descripcion: r.descripcion || '',
    tipo: 'custom',
    fechaLimite: r.fechaLimite instanceof Date
      ? r.fechaLimite.toISOString().split('T')[0]
      : String(r.fechaLimite).split('T')[0],
    recurrencia: 'unica',
    completado: r.completado,
    notas: r.notas,
    createdAt: r.createdAt?.toISOString(),
  };
}

export async function deleteRecordatorio(
  pool: Pool,
  userId: string,
  id: number
): Promise<boolean> {
  const { rowCount } = await pool.query(
    `DELETE FROM recordatorios WHERE id = $1`,
    [id]
  );
  return (rowCount ?? 0) > 0;
}
