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="px-5 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>
    );
} 