import { Checkbox } from '@/components/ui/checkbox';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useTranslation } from '@/hooks/use-translation';
import { useId, useState } from 'react';
import { editableWeekend, ISO_DAYS, toggleWeekendDay } from '../../lib/rule-sections';
import { equivalentLabel, multiplierEquivalent, multiplierFieldText, multiplierFromField, RULE_BOUNDS } from '../../lib/rule-units';
import type { WeekendRule } from '../../types';
import HelpHint from '../HelpHint';

const NS = 'yield.index';

interface WeekendEditorProps {
    value: WeekendRule;
    onChange: (rule: WeekendRule) => void;
}

/**
 * Éditeur de la règle « week-end » : un multiplicateur et les nuits qu'il
 * touche. Partagé par l'éditeur d'un logement et par la feuille d'un groupe de
 * règles, comme LastMinuteEditor.
 *
 * Le multiplicateur se saisit tel quel (×1,10) et son équivalent s'affiche à
 * côté (« soit +10 % »), avec les mêmes fonctions que les paliers last-minute
 * (lib/rule-units.ts). Les nuits sont des jours ISO (1 = lundi … 7 =
 * dimanche) : la « nuit du vendredi » commence le vendredi — c'est le jour de
 * la date de la nuit que lit le calculateur.
 *
 * Le champ garde le texte TAPÉ (multiplierFieldText) et la valeur remontée
 * est le nombre tapé, tel quel (editableWeekend, multiplierFromField) : 0 ou
 * un champ vide partent au serveur, qui les refuse, au lieu d'être réécrits
 * « 1 » sous le curseur — ce qui changeait « 0.9 » en ×1,9.
 */
export default function WeekendEditor({ value, onChange }: WeekendEditorProps) {
    const { t, locale } = useTranslation();
    const id = useId();
    const soit = t(NS, 'unit_equivalent', 'soit :value');
    // Jours normalisés, multiplicateur tel que saisi (0 et NaN compris).
    const rule = editableWeekend(value);
    // Dernier texte tapé dans le champ ; null tant que rien n'a été tapé.
    const [typed, setTyped] = useState<string | null>(null);

    // Appels t() LITTÉRAUX, un par jour : YieldTranslationsTest ne voit que
    // ceux-là — une clé construite à la volée échapperait au contrôle fr/en.
    const nightLabels: Record<number, string> = {
        1: t(NS, 'weekend_night_mon', 'Nuit du lundi'),
        2: t(NS, 'weekend_night_tue', 'Nuit du mardi'),
        3: t(NS, 'weekend_night_wed', 'Nuit du mercredi'),
        4: t(NS, 'weekend_night_thu', 'Nuit du jeudi'),
        5: t(NS, 'weekend_night_fri', 'Nuit du vendredi'),
        6: t(NS, 'weekend_night_sat', 'Nuit du samedi'),
        7: t(NS, 'weekend_night_sun', 'Nuit du dimanche'),
    };

    return (
        <div className="space-y-3">
            <p className="text-muted-foreground text-xs">
                {t(
                    NS,
                    'weekend_help',
                    '×1 = aucun effet ; au-dessus de 1 les nuits choisies coûtent plus cher, en dessous moins cher ; le prix reste dans la bande Min/Max.',
                )}
            </p>

            <div className="flex flex-wrap items-center gap-2 rounded-lg border p-3">
                <Label htmlFor={`${id}-multiplier`} className="min-w-0 flex-1 text-sm font-medium">
                    {t(NS, 'weekend_multiplier', 'Multiplicateur')}
                    <HelpHint
                        text={t(
                            NS,
                            'weekend_multiplier_help',
                            'Appliqué au prix de la saison, avant la dernière minute et le remplissage. Exemple base 100 : ×1,10 = 110 les nuits cochées ; ×0,90 = 90.',
                        )}
                    />
                </Label>
                <div className="flex items-center gap-1">
                    <span className="text-muted-foreground text-xs">×</span>
                    <Input
                        id={`${id}-multiplier`}
                        type="number"
                        step="0.05"
                        min={RULE_BOUNDS.weekendMultiplier.min}
                        max={RULE_BOUNDS.weekendMultiplier.max}
                        value={multiplierFieldText(typed, rule.multiplier)}
                        onChange={(e) => {
                            setTyped(e.target.value);
                            onChange({ ...rule, multiplier: multiplierFromField(e.target.value) });
                        }}
                        className="h-8 w-20 text-right"
                    />
                </div>
                <span className="text-muted-foreground w-24 text-xs">{equivalentLabel(soit, multiplierEquivalent(rule.multiplier, locale))}</span>
            </div>

            <div className="space-y-2 rounded-lg border p-3">
                <Label className="text-sm font-medium">
                    {t(NS, 'weekend_nights', 'Nuits concernées')}
                    <HelpHint
                        text={t(
                            NS,
                            'weekend_nights_help',
                            'La nuit du vendredi est celle qui commence le vendredi (arrivée le vendredi, départ le samedi). Par défaut : vendredi et samedi.',
                        )}
                    />
                </Label>
                <div className="grid grid-cols-2 gap-2 sm:grid-cols-4">
                    {ISO_DAYS.map((day) => (
                        <label key={day} className="flex cursor-pointer items-center gap-2 text-sm">
                            <Checkbox
                                checked={rule.days.includes(day)}
                                onCheckedChange={(checked) => onChange(toggleWeekendDay(rule, day, checked === true))}
                            />
                            {nightLabels[day]}
                        </label>
                    ))}
                </div>
                {rule.days.length === 0 && (
                    <p className="text-xs text-amber-700 dark:text-amber-300">
                        {t(
                            NS,
                            'weekend_no_night',
                            'Cochez au moins une nuit : sans nuit, la règle ne peut pas être enregistrée. Pour qu’elle n’ait aucun effet, mettez ×1.',
                        )}
                    </p>
                )}
            </div>
        </div>
    );
}
