import RoleController from "@/actions/App/Http/Controllers/RoleController";
import SelectPermissions from "@/components/selects/select-permission";
import AppLayout from "@/layouts/app-layout";
import { MetaTags } from "@/types";
import { UserRole } from "@/types/user";
import { Head, router, useForm } from "@inertiajs/react";
import { useEffect } from "react";
import { Button, Card, Container, Form } from "react-bootstrap";
import { PiSpeedometerDuotone } from "react-icons/pi";
import { toast } from "react-toastify";

interface Props {
    metaTags: MetaTags;
    mode: "create" | "edit";
    role?: UserRole;
}

export default function FormBuilder({ metaTags, mode, role }: Props) {
    const { data, setData, errors, post, put, processing } = useForm<{ name: string, permissions: number[] }>({
        name: '',
        permissions: [],
    });

    useEffect(() => {
        if (!!role) {
            setData({
                name: role?.name ?? '',
                permissions: role?.permissions?.map((permission) => permission.id),
            });
        }
    }, [role]);

    const handleSubmit = (e: React.FormEvent) => {
        e.preventDefault();

        if (mode === 'create') {
            post(RoleController.store.url(), {
                onError: (callback) => {
                    toast.error(JSON.stringify(callback, null, 2));
                },
            });
        } else {
            put(RoleController.update.url(role!.id), {
                onError: (callback) => {
                    toast.error(JSON.stringify(callback, null, 2));
                },
            });
        }
    }

    return (
        <AppLayout>
            <Head title={metaTags.title} />

            <Container className="p-0">
                <Form onSubmit={handleSubmit}>
                    <Card body className="mb-4 border border-dashed">
                        <h5 className="mb-4 fw-semibold">Role Information</h5>
                        <Form.Group>
                            <Form.Label htmlFor="name" className="required">Role Name</Form.Label>
                            <Form.Control
                                id="name"
                                name="name"
                                value={data.name}
                                onChange={(e) => setData('name', e.target.value)}
                                isInvalid={!!errors.name}
                                placeholder="Enter role name (e.g., admin, client, auditor)"
                            />
                            <Form.Control.Feedback type="invalid">{errors.name}</Form.Control.Feedback>
                        </Form.Group>
                    </Card>

                    <Card body className="mb-4 border border-dashed">
                        <h5 className="mb-4 fw-semibold">Permissions</h5>

                        <SelectPermissions
                            values={data.permissions}
                            onChange={(permissionId, checked) => {
                                if (checked) {
                                    setData('permissions', [...data.permissions, permissionId]);
                                } else {
                                    setData('permissions', data.permissions.filter(id => id !== permissionId));
                                }
                            }}
                        />
                    </Card>

                    <div className="d-flex flex-wrap gap-2">
                        <div className="flex-fill d-grid">
                            <Button type="button" variant="light" onClick={() => router.visit(RoleController.index.url())} disabled={processing}>Cancel</Button>
                        </div>
                        <div className="flex-fill d-grid">
                            <Button type="submit" variant="primary" disabled={processing}>
                                {mode === 'create' ? 'Submit' : 'Update'}
                            </Button>
                        </div>
                    </div>
                </Form>
            </Container>
        </AppLayout>
    )
}
