import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Label } from '@/components/ui/label';
import { Switch } from '@/components/ui/switch';
import AppLayout from '@/layouts/app-layout';
import { type BreadcrumbItem } from '@/types';
import { Head, router, usePage } from '@inertiajs/react';
import { ArrowLeft } from 'lucide-react';
import { useState } from 'react';
import { toast } from 'sonner';
import type { SeasonTemplate } from '../logements/season-range-utils';
import { FranchiseReadOnlyBanner } from './components/FranchiseScope';
import { useCanManageYield, useReadOnlyReason, useYieldScope } from './hooks/useYieldPermissions';
import { scopeQuery } from './lib/yield-scope';
import PriceCalendarPreview from './components/PriceCalendarPreview';
import YieldRuleEditor, { type YieldConfigData } from './components/YieldRuleEditor';
import type { MovableHolidays, PriceDay, RuleSectionValues } from './types';

interface PageProps {
    config: YieldConfigData;
    preview: PriceDay[];
    obaPresets: Record<string, YieldConfigData['oba_rules']>;
    seasonTemplates: SeasonTemplate[];
    /** Dates des fêtes mobiles (config/yield-holidays.php). */
    movableHolidays?: MovableHolidays;
    exchangeRate: number;
    /** Défauts / formes neutres des sections, pour l'interrupteur « Règle active ». */
    sectionDefaults: RuleSectionValues;
    sectionDisabled: RuleSectionValues;
    [key: string]: unknown;
}

export default function YieldEdit() {
    const { config, preview, obaPresets, seasonTemplates, movableHolidays, exchangeRate, sectionDefaults, sectionDisabled } = usePage<PageProps>().props;

    // `?coHost=` : le siège consulte une franchise — le retour garde ce périmètre.
    const scope = scopeQuery(useYieldScope().coHost);

    const breadcrumbs: BreadcrumbItem[] = [
        { title: 'Yield Manager', href: route('yield.index', scope) },
        { title: config.property_name, href: `/yield/${config.id}/edit` },
    ];

    const [livePreview, setLivePreview] = useState<PriceDay[]>(preview);
    const [basePrice, setBasePrice] = useState<number>(config.base_price);
    const [previewStale, setPreviewStale] = useState(false);

    const canManage = useCanManageYield();
    const readOnlyReason = useReadOnlyReason();

    function handleToggle() {
        // Sans `yield.manage`, POST yield.toggle répond 403 : l'interrupteur est
        // éteint et explique pourquoi ; ce retour ferme les autres chemins.
        if (!canManage) return;

        router.post(
            route('yield.toggle', config.id),
            {},
            {
                preserveState: true,
                onSuccess: () => toast.success('Statut mis à jour'),
            },
        );
    }

    return (
        <AppLayout breadcrumbs={breadcrumbs}>
            <Head title={`Yield — ${config.property_name}`} />
            <div className="flex flex-col gap-6 p-6">
                {/* Header */}
                <div className="flex items-center justify-between">
                    <div className="flex items-center gap-4">
                        <Button variant="ghost" size="icon" onClick={() => router.visit(route('yield.index', scope))}>
                            <ArrowLeft className="h-4 w-4" />
                        </Button>
                        <div>
                            <h1 className="text-xl font-bold">{config.property_name}</h1>
                            <p className="text-muted-foreground text-sm">
                                ID: {config.property_id} · #{config.internal_id}
                            </p>
                        </div>
                    </div>
                    <div className="flex items-center gap-2">
                        <Label className="text-sm">Actif</Label>
                        {/* `title` sur l'enveloppe : un Switch désactivé n'émet pas de survol. */}
                        <span title={canManage ? undefined : readOnlyReason}>
                            <Switch checked={config.is_active} disabled={!canManage} onCheckedChange={handleToggle} />
                        </span>
                    </div>
                </div>

                <FranchiseReadOnlyBanner />

                {/* Rule editor + live calendar preview */}
                <div className="grid gap-6 lg:grid-cols-2">
                    <YieldRuleEditor
                        config={config}
                        obaPresets={obaPresets}
                        exchangeRate={exchangeRate}
                        seasonTemplates={seasonTemplates}
                        movableHolidays={movableHolidays}
                        sectionDefaults={sectionDefaults}
                        sectionDisabled={sectionDisabled}
                        onPreview={setLivePreview}
                        onPreviewStale={setPreviewStale}
                        onBasePriceChange={setBasePrice}
                    />

                    <Card>
                        <CardHeader>
                            <CardTitle className="text-base">Preview des prix (90 jours)</CardTitle>
                        </CardHeader>
                        <CardContent>
                            <PriceCalendarPreview preview={livePreview} exchangeRate={exchangeRate} basePrice={basePrice} stale={previewStale} />
                        </CardContent>
                    </Card>
                </div>
            </div>
        </AppLayout>
    );
}
