import { v4 as uuidv4 } from "uuid";
import { useStateStore, AppNode, nodeLabel, useEnv, GatewayTCPNode, nodeIsConnectable } from '@/lib/state';
import { Edge, Handle, Position, useNodes } from '@xyflow/react';
import { NodeRect } from './node-rect';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { z } from "zod";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm, EventType, DeepPartial } from 'react-hook-form';
import { Form, FormControl, FormField, FormItem, FormMessage } from './ui/form';
import { Input } from './ui/input';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select';
import { Button } from "./ui/button";

const schema = z.object({
  network: z.string().min(1, "reqired"),
  subdomain: z.string().min(1, "required"),
});

const connectedToSchema = z.object({
  serviceId: z.string(),
  portId: z.string(),
});

export function NodeGatewayTCP(node: GatewayTCPNode) {
  const { id, selected } = node;
  const isConnectableNetwork = useMemo(() => nodeIsConnectable(node, "subdomain"), [node]);
  const isConnectable = useMemo(() => nodeIsConnectable(node, "tcp"), [node]);
  return (
    <NodeRect id={id} selected={selected} type={node.type} state={node.data.state}>
      {nodeLabel(node)}
      <Handle
        type={"source"}
        id="subdomain"
        position={Position.Top}
        isConnectable={isConnectableNetwork}
        isConnectableStart={isConnectableNetwork}
        isConnectableEnd={isConnectableNetwork}
      />
      <Handle
        type={"target"}
        id="tcp"
        position={Position.Bottom}
        isConnectable={isConnectable}
        isConnectableStart={isConnectable}
        isConnectableEnd={isConnectable}
      />
    </NodeRect>
  );
}

export function NodeGatewayTCPDetails({ id, data }: GatewayTCPNode) {
  const store = useStateStore();
  const env = useEnv();
  const form = useForm<z.infer<typeof schema>>({
    resolver: zodResolver(schema),
    mode: "onChange",
    defaultValues: {
      network: data.network,
      subdomain: data.subdomain,
    },
  });
  useEffect(() => {
    const sub = form.watch((value: DeepPartial<z.infer<typeof schema>>, { name }: { name?: keyof z.infer<typeof schema> | undefined, type?: EventType | undefined }) => {
      if (name === "network") {
        let edges = store.edges;
        if (data.network !== undefined) {
          edges = edges.filter((e) => {
            console.log(e);
            if (e.source === id && e.sourceHandle === "subdomain" && e.target === data.network && e.targetHandle === "subdomain") {
              return false;
            } else {
              return true;
            }
          });
        }
        if (value.network !== undefined) {
          edges = edges.concat({
            id: uuidv4(),
            source: id,
            sourceHandle: "subdomain",
            target: value.network,
            targetHandle: "subdomain",
          });
        }
        store.setEdges(edges);
        store.updateNodeData<"gateway-tcp">(id, { network: value.network });
      } else if (name === "subdomain") {
        store.updateNodeData<"gateway-tcp">(id, { subdomain: value.subdomain });
      }
    });
    return () => sub.unsubscribe();
  }, [id, data, form, store]);
  const connectedToForm = useForm<z.infer<typeof connectedToSchema>>({
    resolver: zodResolver(connectedToSchema),
    mode: "onSubmit",
    defaultValues: {
      serviceId: data.selected?.serviceId,
      portId: data.selected?.portId,
    },
  });
  useEffect(() => {
    connectedToForm.reset({
      serviceId: data.selected?.serviceId,
      portId: data.selected?.portId,
    });
    console.log(connectedToForm.getValues());
  }, [id, connectedToForm, data]);
  const nodes = useNodes<AppNode>();
  const [selected, setSelected] = useState<AppNode | undefined>(undefined);
  useEffect(() => {
    if (data.selected?.serviceId == null) {
      setSelected(undefined);
    } else {
      const serviceId = data.selected.serviceId;
      setSelected(nodes.find((n) => n.id === serviceId));
    }
  }, [id, data, setSelected, nodes]);
  const selectable = useMemo(() => {
    console.log(selected);
    return nodes.filter((n) => {
      if (n.id === id) {
        return false;
      }
      if (selected != null && selected.id === id) {
        return true;
      }
      if ("ports" in n.data && (n.data.ports || []).length > 0) {
        return true;
      }
      return false;
    })
  }, [id, nodes, selected]);
  useEffect(() => {
    const sub = connectedToForm.watch((value: DeepPartial<z.infer<typeof connectedToSchema>>, { name, type }: { name?: keyof z.infer<typeof connectedToSchema> | undefined, type?: EventType | undefined }) => {
      if (type !== "change") {
        return;
      }
      switch (name) {
        case "serviceId":
          if (!value.serviceId) {
            break;
          }
          store.updateNodeData<"gateway-tcp">(id, {
            selected: {
              serviceId: value.serviceId,
            },
          });
          break;
        case "portId":
          if (!value.portId) {
            break;
          }
          store.updateNodeData<"gateway-tcp">(id, {
            selected: {
              serviceId: value.serviceId,
              portId: value.portId,
            },
          });
          break;
      }
    });
    return () => sub.unsubscribe();
  }, [id, connectedToForm, store]);
  const [nodeLabels, setNodeLabels] = useState(new Map<string, string>());
  const [portLabels, setPortLabels] = useState(new Map<string, string>());
  useEffect(() => {
    setNodeLabels(new Map((data.exposed || []).map((e) => [e.serviceId, nodeLabel(nodes.find((n) => n.id === e.serviceId)!)])));
    setPortLabels(new Map((data.exposed || []).map((e) => [`${e.serviceId} - ${e.portId}`, (nodes.find((n) => n.id === e.serviceId)!.data.ports || []).find((p) => p.id === e.portId)!.name])));
  }, [nodes, data, setNodeLabels, setPortLabels]);
  const onSubmit = useCallback((values: z.infer<typeof connectedToSchema>) => {
    const edges = store.edges.filter((e) => e.target !== id);
    const exp = (data.exposed || []).concat({
      serviceId: values.serviceId,
      portId: values.portId,
    });
    store.updateNodeData<"gateway-tcp">(id, {
      exposed: exp,
      selected: undefined,
    });
    store.setEdges(edges.concat(exp.map((e): Edge => ({
      id: uuidv4(),
      source: e.serviceId,
      sourceHandle: "ports",
      target: id,
      targetHandle: "tcp",
    }))));
  }, [id, data, store]);
  return (
    <>
      <Form {...form}>
        <form className="space-y-2">
          <FormField
            control={form.control}
            name="network"
            render={({ field }) => (
              <FormItem>
                <Select onValueChange={field.onChange} defaultValue={field.value}>
                  <FormControl>
                    <SelectTrigger>
                      <SelectValue placeholder="Network" />
                    </SelectTrigger>
                  </FormControl>
                  <SelectContent>
                    {env.networks.map((n) => (
                      <SelectItem key={n.name} value={n.domain}>{`${n.name} - ${n.domain}`}</SelectItem>
                    ))}
                  </SelectContent>
                </Select>
                <FormMessage />
              </FormItem>
            )}
          />
          <FormField
            control={form.control}
            name="subdomain"
            render={({ field }) => (
              <FormItem>
                <FormControl>
                  <Input placeholder="subdomain" className="border border-black" {...field} />
                </FormControl>
                <FormMessage />
              </FormItem>
            )}
          />
        </form>
      </Form>
      Exposed Services
      <ul>
        {(data.exposed || []).map((e, i) => (
          <li key={i}>
            {nodeLabels.get(e.serviceId)} - {portLabels.get(`${e.serviceId} - ${e.portId}`)}
          </li>
        ))}
      </ul>
      <Form {...connectedToForm}>
        <form className="space-y-2" onSubmit={connectedToForm.handleSubmit(onSubmit)}>
          <FormField
            control={connectedToForm.control}
            name="serviceId"
            render={({ field }) => (
              <FormItem>
                <Select onValueChange={field.onChange} defaultValue={field.value}>
                  <FormControl>
                    <SelectTrigger>
                      <SelectValue placeholder="Service" />
                    </SelectTrigger>
                  </FormControl>
                  <SelectContent>
                    {selectable.map((n) => (
                      <SelectItem value={n.id}>{nodeLabel(n)}</SelectItem>
                    ))}
                  </SelectContent>
                </Select>
                <FormMessage />
              </FormItem>
            )}
          />
          <FormField
            control={connectedToForm.control}
            name="portId"
            render={({ field }) => (
              <FormItem>
                <Select onValueChange={field.onChange} defaultValue={field.value}>
                  <FormControl>
                    <SelectTrigger>
                      <SelectValue placeholder="Port" />
                    </SelectTrigger>
                  </FormControl>
                  <SelectContent>
                    {selected && (selected.data.ports || []).map((p) => (
                      <SelectItem key={p.id} value={p.id}>{p.name} - {p.value}</SelectItem>
                    ))}
                  </SelectContent>
                </Select>
                <FormMessage />
              </FormItem>
            )}
          />
          <Button type="submit">Expose</Button>
        </form>
      </Form>
    </>
  );
}