import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { useTranslation } from '@/hooks/use-translation';
import { normalizeFarOut } from '../../lib/rule-sections';
import {
    equivalentLabel,
    farOutEquivalent,
    farOutPremiumFromField,
    farOutPremiumToField,
    multiplierEquivalent,
    RULE_BOUNDS,
} from '../../lib/rule-units';
import type { FarOutPremium, LastMinuteRule } from '../../types';
import HelpHint from '../HelpHint';

const NS = 'yield.index';

interface LastMinuteEditorProps {
    lastMinute: LastMinuteRule[];
    /** Prime long terme : `premium_pct` est une FRACTION stockée (0.10 = +10 %). */
    farOut: FarOutPremium;
    onChangeLastMinute: (rules: LastMinuteRule[]) => void;
    onChangeFarOut: (farOut: FarOutPremium) => void;
}

/**
 * Controlled editor for last-minute discounts (multiplier per "days_before"
 * tier) and the far-out premium. Extracted from YieldRuleEditor so it is shared
 * by the per-house editor and the rule-group editor.
 *
 * La prime se saisit en % ENTIER (10 = +10 %) alors qu'elle reste stockée en
 * fraction : la conversion passe exclusivement par farOutPremiumToField() /
 * farOutPremiumFromField() (lib/rule-units.ts, testées en aller-retour). Les
 * props et le payload restent en fraction — ouvrir puis enregistrer sans
 * toucher renvoie exactement la valeur stockée. Sous chaque valeur, son
 * équivalent dans l'autre unité (« ×0,70 → soit −30 % »).
 */
export default function LastMinuteEditor({ lastMinute, farOut, onChangeLastMinute, onChangeFarOut }: LastMinuteEditorProps) {
    const { t, locale } = useTranslation();
    const soit = t(NS, 'unit_equivalent', 'soit :value');
    const tiers = Array.isArray(lastMinute) ? lastMinute : [];
    const premium = normalizeFarOut(farOut);

    const setMultiplier = (i: number, value: number) => onChangeLastMinute(tiers.map((r, idx) => (idx === i ? { ...r, multiplier: value } : r)));

    return (
        <div className="space-y-3">
            <Label className="text-sm font-medium">
                {t(NS, 'last_minute_title', 'Rabais last-minute')}
                <HelpHint
                    text={t(
                        NS,
                        'last_minute_help',
                        'Rabais sur les nuits ENCORE LIBRES proches, pour les remplir. Exemple base 100 : le jour même ×0,70 = 70 ; 1-2 j ×0,80 = 80 ; 3-7 j ×0,90 = 90. Une nuit déjà réservée n’est jamais bradée.',
                    )}
                />
            </Label>

            {tiers.map((rule, i) => (
                <div key={i} className="flex flex-wrap items-center gap-2 rounded-lg border p-3">
                    <div className="min-w-0 flex-1">
                        <div className="text-sm font-medium">{rule.label}</div>
                        <div className="text-muted-foreground text-xs">
                            {t(NS, 'last_minute_tier_hint', 'J-:days si vide').replace(':days', String(rule.days_before))}
                        </div>
                    </div>
                    <div className="flex items-center gap-1">
                        <span className="text-muted-foreground text-xs">×</span>
                        <Input
                            type="number"
                            step="0.05"
                            min={RULE_BOUNDS.lastMinuteMultiplier.min}
                            max={RULE_BOUNDS.lastMinuteMultiplier.max}
                            value={rule.multiplier}
                            onChange={(e) => setMultiplier(i, Number(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 border-dashed p-3">
                <Label className="text-sm font-medium">
                    {t(NS, 'far_out_title', 'Far-out premium')}
                    <HelpHint
                        text={t(
                            NS,
                            'far_out_help',
                            'Prime sur les réservations très anticipées (le client qui réserve tôt paie un peu plus), saisie en % : 10 = +10 % (×1,10). Exemple : +10 % au-delà de 60 jours → base 100 = 110. 0 = pas de prime.',
                        )}
                    />
                </Label>
                <div className="flex flex-wrap items-center gap-2">
                    <Label className="text-muted-foreground text-xs">{t(NS, 'far_out_after', 'Après J+')}</Label>
                    <Input
                        type="number"
                        step="1"
                        min={RULE_BOUNDS.farOutThresholdDays.min}
                        max={RULE_BOUNDS.farOutThresholdDays.max}
                        value={premium.threshold_days}
                        onChange={(e) => onChangeFarOut({ ...premium, threshold_days: Number(e.target.value) })}
                        className="h-8 w-16 text-right"
                    />
                    <Label className="text-muted-foreground text-xs">{t(NS, 'far_out_then', 'jours → +')}</Label>
                    <Input
                        type="number"
                        step="1"
                        min={RULE_BOUNDS.farOutPremiumPercent.min}
                        max={RULE_BOUNDS.farOutPremiumPercent.max}
                        value={farOutPremiumToField(premium)}
                        onChange={(e) => onChangeFarOut(farOutPremiumFromField(premium, e.target.value))}
                        className="h-8 w-16 text-right"
                    />
                    <span className="text-muted-foreground text-xs">%</span>
                    <span className="text-muted-foreground text-xs">{equivalentLabel(soit, farOutEquivalent(premium, locale))}</span>
                </div>
            </div>
        </div>
    );
}
