import { useProjectId, useGithubService, useStateStore } from '@/lib/state';
import { Form, FormControl, FormField, FormItem, FormMessage } from './components/ui/form';
import { Input } from './components/ui/input';
import { useForm } from 'react-hook-form';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import { Button } from './components/ui/button';
import { useToast } from '@/hooks/use-toast';
import { Checkbox } from './components/ui/checkbox';
import { useState, useCallback } from 'react';

const schema = z.object({
    githubToken: z.string().min(1, "GitHub token is required"),
});

export function Integrations() {
    const { toast } = useToast();
    const store = useStateStore();
    const projectId = useProjectId();
    const [isEditing, setIsEditing] = useState(false);
    const githubService = useGithubService();
    const [isSaving, setIsSaving] = useState(false);

    const form = useForm<z.infer<typeof schema>>({
        resolver: zodResolver(schema),
        mode: "onChange",
    });

    const onSubmit = useCallback(async (data: z.infer<typeof schema>) => {
        if (!projectId) return;

        setIsSaving(true);

        try {
            const response = await fetch(`/api/project/${projectId}/github-token`, {
                method: "POST",
                headers: {
                    "Content-Type": "application/json",
                },
                body: JSON.stringify({ githubToken: data.githubToken }),
            });

            if (!response.ok) {
                throw new Error("Failed to save GitHub token");
            }

            await store.refreshEnv();
            setIsEditing(false);
            form.reset();
            toast({
                title: "GitHub token saved successfully",
            });
        } catch (error) {
            toast({
                variant: "destructive",
                title: "Failed to save GitHub token",
                description: error instanceof Error ? error.message : "Unknown error",
            });
        } finally {
            setIsSaving(false);
        }
    }, [projectId, store, form, toast, setIsEditing, setIsSaving]);

    const handleCancel = () => {
        setIsEditing(false);
        form.reset();
    };

    return (
        <div className="space-y-6">
            <div>
                <h3 className="text-md font-medium mb-2">GitHub</h3>
                <div className="space-y-4">
                    <div className="flex items-center space-x-2">
                        <Checkbox checked={!!githubService} disabled />
                        <label className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
                            GitHub Access Token
                        </label>
                    </div>

                    {!!githubService && !isEditing && (
                        <Button
                            variant="outline"
                            onClick={() => setIsEditing(true)}
                        >
                            Update Access Token
                        </Button>
                    )}

                    {(!!!githubService || isEditing) && (
                        <Form {...form}>
                            <form className="space-y-4" onSubmit={form.handleSubmit(onSubmit)}>
                                <FormField
                                    control={form.control}
                                    name="githubToken"
                                    render={({ field }) => (
                                        <FormItem>
                                            <FormControl>
                                                <Input
                                                    type="password"
                                                    placeholder="GitHub Personal Access Token"
                                                    className="border border-black"
                                                    {...field}
                                                />
                                            </FormControl>
                                            <FormMessage />
                                        </FormItem>
                                    )}
                                />
                                <div className="flex space-x-2">
                                    <Button type="submit" disabled={isSaving}>
                                        {isSaving ? "Saving..." : "Save"}
                                    </Button>
                                    {!!githubService && (
                                        <Button
                                            type="button"
                                            variant="outline"
                                            onClick={handleCancel}
                                            disabled={isSaving}
                                        >
                                            Cancel
                                        </Button>
                                    )}
                                </div>
                            </form>
                        </Form>
                    )}
                </div>
            </div>
        </div>
    );
} 