import type { Torrent } from '../shared';
import { useEffect, useState } from 'react';
import { Button } from '@/components/ui/button';
import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogFooter,
  DialogHeader,
  DialogTitle,
} from '@/components/ui/dialog';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { useTorrentMutations } from '../useTransmissionData';

// Transmission 4 replaced the old trackerAdd/trackerRemove/trackerReplace triple with `trackerList`: the
// whole announce list as text, one URL per line, a blank line between tiers. Editing text is also the only
// honest way to express tiers, which a list of rows with buttons cannot.

type TrackersDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; torrent: Torrent | null };

/** Rebuild the tier-separated text from trackerStats when the daemon didn't send trackerList. */
function fromStats(torrent: Torrent): string {
  const tiers = new Map<number, string[]>();
  for (const t of torrent.trackerStats ?? []) {
    const list = tiers.get(t.tier) ?? [];
    list.push(t.announce);
    tiers.set(t.tier, list);
  }
  return [...tiers.entries()]
    .sort((a, b) => a[0] - b[0])
    .map(([, urls]) => urls.join('\n'))
    .join('\n\n');
}

export const TrackersDialog = ({ open, onOpenChange, torrent }: TrackersDialogProps) => {
  const { set } = useTorrentMutations();
  const [text, setText] = useState('');

  useEffect(() => {
    if (!open || !torrent) return;
    setText(torrent.trackerList ?? fromStats(torrent));
  }, [open, torrent]);

  const submit = async () => {
    if (!torrent) return;
    // Trailing whitespace on a line makes Transmission reject the whole list, and pasting from a website
    // reliably brings some along.
    const normalised = text
      .split('\n')
      .map((line) => line.trim())
      .join('\n');
    await set.mutateAsync({ ids: [torrent.id], trackerList: normalised });
    onOpenChange(false);
  };

  return (
    <Dialog open={open} onOpenChange={onOpenChange}>
      <DialogContent className="max-w-lg">
        <DialogHeader>
          <DialogTitle>Trackers</DialogTitle>
          <DialogDescription className="break-words">{torrent?.name}</DialogDescription>
        </DialogHeader>

        <div className="space-y-1.5">
          <Label htmlFor="tr-trackers">Announce URLs</Label>
          <Textarea
            id="tr-trackers"
            rows={10}
            value={text}
            onChange={(ev) => setText(ev.target.value)}
            className="font-mono text-xs"
          />
          <p className="text-xs text-muted-foreground">
            One URL per line. Leave a blank line between tiers — Transmission only falls through to the next tier when
            every tracker in the one above it fails.
          </p>
        </div>

        {torrent?.isPrivate && (
          <p className="rounded-lg bg-amber-500/10 px-3 py-2 text-xs text-amber-500">
            This is a private torrent. Adding trackers it wasn't issued with will not help and may get you banned from
            the tracker it came from.
          </p>
        )}

        <DialogFooter>
          <Button variant="ghost" onClick={() => onOpenChange(false)}>
            Cancel
          </Button>
          <Button onClick={submit} disabled={set.isPending}>
            Save
          </Button>
        </DialogFooter>
      </DialogContent>
    </Dialog>
  );
};
