import React from 'react';
import { Form, Formik } from 'formik';
import { object, number, boolean, string } from 'yup';
import { Dialog } from '@/components/elements/dialog';
import { Button } from '@/components/elements/button/index';
import Field from '@/components/elements/Field';
import FormikSwitch from '@/components/elements/FormikSwitch';
import Label from '@/components/elements/Label';
import Select from '@/components/elements/Select';
import Spinner from '@/components/elements/Spinner';
import { TrashCleanupSettings } from '../api/server/files/betterFilesApi';

interface Props {
    visible: boolean;
    onDismiss: () => void;
    settings: TrashCleanupSettings | null;
    onSave: (values: { trash_cleanup_enabled: boolean; trash_retention_days: number; trash_retention_unit: 'days' | 'hours' }) => Promise<void>;
}

const TrashCleanupSettingsModal: React.FC<Props> = ({ visible, onDismiss, settings, onSave }) => {
    const initialValues = {
        trash_cleanup_enabled: settings?.trash_cleanup_enabled ?? false,
        trash_retention_days: settings?.trash_retention_days ?? 30,
        trash_retention_unit: settings?.trash_retention_unit ?? 'days',
    };

    return (
        <Dialog open={visible} onClose={onDismiss} title="Trash Cleanup">
            {!settings ? (
                <div className="py-6 flex items-center justify-center text-neutral-300">
                    <Spinner size="small" />
                    <span className="ml-2">Loading settings...</span>
                </div>
            ) : (
                <Formik
                    enableReinitialize
                    initialValues={initialValues}
                    validationSchema={object().shape({
                        trash_cleanup_enabled: boolean().required(),
                        trash_retention_days: number().required().integer().min(1),
                        trash_retention_unit: string().required().oneOf(['days', 'hours']),
                    })}
                    onSubmit={async (values, { setSubmitting }) => {
                        try {
                            await onSave({
                                trash_cleanup_enabled: values.trash_cleanup_enabled,
                                trash_retention_days: Number(values.trash_retention_days),
                                trash_retention_unit: values.trash_retention_unit as 'days' | 'hours',
                            });
                            onDismiss();
                        } finally {
                            setSubmitting(false);
                        }
                    }}
                >
                    {({ values, setFieldValue, isSubmitting }) => (
                        <Form>
                            <div className="space-y-6">
                                <FormikSwitch
                                    name="trash_cleanup_enabled"
                                    label="Enable automatic trash cleanup"
                                    description="Automatically delete old items from the trash."
                                />
                                <div className="grid grid-cols-1 gap-4 md:grid-cols-2">
                                    <Field
                                        id="trash_retention_days"
                                        name="trash_retention_days"
                                        type="number"
                                        min={1}
                                        label="Delete items older than"
                                        description="Set how old items must be before deletion."
                                    />
                                    <div>
                                        <Label htmlFor="trash_retention_unit">Unit</Label>
                                        <Select
                                            id="trash_retention_unit"
                                            name="trash_retention_unit"
                                            value={values.trash_retention_unit}
                                            onChange={(e) => setFieldValue('trash_retention_unit', e.currentTarget.value)}
                                        >
                                            <option value="hours">Hours</option>
                                            <option value="days">Days</option>
                                        </Select>
                                    </div>
                                </div>
                            </div>
                            <Dialog.Footer>
                                <Button.Text type="button" onClick={onDismiss}>
                                    Cancel
                                </Button.Text>
                                <Button type="submit" disabled={isSubmitting}>
                                    {isSubmitting ? 'Saving...' : 'Save Settings'}
                                </Button>
                            </Dialog.Footer>
                        </Form>
                    )}
                </Formik>
            )}
        </Dialog>
    );
};

export default TrashCleanupSettingsModal;
