"use client";
import Image from "next/image";
import PackageCamera from "./lib/camera/component/pakageCamera";
import BarcodeScanner from "./lib/camera/component/scannerBarcode";
import SjCamera from "./lib/camera/component/sjCamera";
import DispatchCamera from "./lib/camera/component/dispatchCamera";
import useCameraStore from "./lib/camera/hooks/useCameraStore";
import Header from "./lib/camera/component/hedear";
import { Button, FormControl, InputLabel, MenuItem, Select, FormHelperText } from "@mui/material";
import { SaveAsOutlined } from "@mui/icons-material";
import axios from "axios";
import odooApi from "./lib/api/odooApi";
import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import { getAuth } from "./lib/api/auth";
import { getCookie } from "cookies-next";

type Role = "driver" | "dispatch";
type ShipMethod = "" | "self_pickup" | "indoteknik_delivery" | "ekspedisi";

export default function Home() {
  const [isLogin, setIsLogin] = useState<boolean>(true);
  const [isDriver, setIsDriver] = useState<boolean>(false);
  const [isDispatch, setIsDispatch] = useState<boolean>(false);
  const [shippingMethod, setShippingMethod] = useState<ShipMethod>("");
  const [shipTouched, setShipTouched] = useState(false);


  const {
    barcode,
    imageSj,
    imagePackage,
    imageDispatch,
    setBarcode,
    setImageSj,
    setImagePackage,
    setImageDispatch,
  } = useCameraStore();

  const [isLoading, setIsLoading] = useState<boolean>(false);
  const router = useRouter();

  useEffect(() => {
    const auth = getAuth();
    if (!auth) {
      router.push("/login");
      return;
    }
    const roleCookie = (getCookie("web_role") as string | undefined)?.toLowerCase() as Role | undefined;
    const role: Role | null = roleCookie === "driver" || roleCookie === "dispatch" ? roleCookie : null;

    setIsLogin(true);
    setIsDriver(role === "driver");
    setIsDispatch(role === "dispatch");
  }, [router]);

  const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
    event.preventDefault();
    setIsLoading(true);

    if (!barcode) {
      alert("Barcode harus diisi.");
      setIsLoading(false);
      return;
    }

    // Dispatch: shipping method wajib
    if (isDispatch) setShipTouched(true);
    if (isDispatch && !shippingMethod) {
      alert("Shipping Method wajib dipilih.");
      setIsLoading(false);
      return;
    }


    // Validasi foto sesuai role & shipping method
    if (isDispatch) {
      if (!imageDispatch) {
        alert("Foto Dispatch Wajib Diisi");
        setIsLoading(false);
        return;
      }
      // SJ opsional untuk self_pickup & ekspedisi → tidak divalidasi
    } else {
      // Driver: SJ & Penerima wajib
      if (!imageSj || !imagePackage) {
        alert("Barcode, Foto SJ, dan Foto Penerima harus tersedia.");
        setIsLoading(false);
        return;
      }
    }

    try {
      const newSjImage = imageSj ? imageSj.replace(/^.*?,/, "") : undefined;
      const newPackageImage = imagePackage ? imagePackage.replace(/^.*?,/, "") : undefined;
      const newDispatchImage =
        imageDispatch && imageDispatch.startsWith("data:")
          ? imageDispatch.replace(/^.*?,/, "")
          : imageDispatch || undefined;

      // Kirim hanya yang ada
      const submittedSj = !!newSjImage;
      const submittedPackage = !!newPackageImage;
      const submittedDispatch = !!newDispatchImage && !isDriver;

      const data: Record<string, string> = {};
      if (submittedSj) data.sj_document = newSjImage!;
      if (submittedPackage) data.paket_document = newPackageImage!;
      if (submittedDispatch) data.dispatch_document = newDispatchImage!;
      // (opsional) kirim shippingMethod jika backend mau simpan
      if (isDispatch && shippingMethod) data.shipping_method = shippingMethod;

      const response = (await odooApi(
        "PUT",
        `/api/v1/stock-picking/${barcode}/documentation`,
        data
      )) as { status?: { code?: number } };

      if (response?.status?.code === 200) {
        alert("Berhasil Submit Data");
        setBarcode("");
        // Bersihkan HANYA yang dikirim
        if (submittedSj) setImageSj("");
        if (submittedPackage) setImagePackage("");
        if (submittedDispatch) setImageDispatch("");
      } else if (response?.status?.code === 404) {
        alert("Gagal Submit Data, Picking Code Tidak Ditemukan");
      } else {
        alert("Gagal Submit Data, Silahkan Coba Lagi");
      }
    } catch (error) {
      if (axios.isAxiosError(error)) {
        console.error("Error:", error.response?.data);
      } else if (error instanceof Error) {
        console.error("Error mengirim data:", error.message);
      } else {
        console.error("Unknown error:", error);
      }
    } finally {
      setIsLoading(false);
    }
  };

  // dispatch: SJ hanya utk self_pickup & ekspedisi
  const showSjForDispatch =
    isDispatch && (shippingMethod === "self_pickup" || shippingMethod === "ekspedisi");

  // dispatch: kamera dispatch tampil utk semua method (asal sudah dipilih)
  const showDispatchForDispatch = isDispatch && shippingMethod !== "";

  // preview SJ: sembunyikan kalau dispatch belum pilih method
  const showSjPreview = !!imageSj && (!isDispatch || showSjForDispatch);

  // preview Dispatch: sembunyikan kalau dispatch belum pilih method
  const showDispatchPreview = !!imageDispatch && (!isDispatch || showDispatchForDispatch);

  return (
    <div className="bg-white h-screen overflow-auto">
      <Header />
      {isLogin && (
        <div className="py-4 px-4 sm:px-96 pt-20">
          <form onSubmit={handleSubmit}>
            <div>
              <BarcodeScanner />
            </div>

            {/* Shipping Method (khusus dispatch) */}
            {isDispatch && (
              <div className="mt-4">
                <FormControl fullWidth size="small" required error={shipTouched && !shippingMethod}>
                  {/* shrink = kunci agar label tidak tumpuk dengan placeholder */}
                  <InputLabel id="shipping-label" shrink>Shipping Method</InputLabel>
                  <Select
                    labelId="shipping-label"
                    id="shipping"
                    label="Shipping Method"
                    value={shippingMethod}
                    displayEmpty
                    onChange={(e) => setShippingMethod(e.target.value as ShipMethod)}
                    onBlur={() => setShipTouched(true)}
                    renderValue={(selected) => {
                      if (!selected) return <span style={{ opacity: 0.6 }}>Pilih Shipping Method</span>;
                      const map: Record<string, string> = {
                        self_pickup: "Self Pickup",
                        indoteknik_delivery: "Indoteknik Delivery",
                        ekspedisi: "Ekspedisi",
                      };
                      return map[selected as string] ?? "";
                    }}
                  >
                    <MenuItem value="">
                      <em>Pilih Shipping Method</em>
                    </MenuItem>
                    <MenuItem value="self_pickup">Self Pickup</MenuItem>
                    <MenuItem value="indoteknik_delivery">Indoteknik Delivery</MenuItem>
                    <MenuItem value="ekspedisi">Ekspedisi</MenuItem>
                  </Select>
                  {shipTouched && !shippingMethod && (
                    <FormHelperText>Wajib pilih shipping method.</FormHelperText>
                  )}
                </FormControl>
              </div>
            )}


            <div className="h-4" />

            <div className="flex justify-between">
              {isDispatch ? (
                <>
                  {showSjForDispatch && <SjCamera />}
                  {showDispatchForDispatch && <DispatchCamera />}
                  {/* dispatch TIDAK perlu kamera penerima */}
                </>
              ) : (
                <>
                  {/* driver / non-dispatch */}
                  <SjCamera />
                  <PackageCamera />
                  {/* driver tidak menampilkan kamera dispatch */}
                </>
              )}
            </div>


            <div className="h-2" />

            {/* Preview SJ */}
            {showSjPreview && (
              <>
                <label className="block mt-2 text-sm font-medium text-gray-700 text-center">
                  Gambar Foto Surat Jalan
                </label>
                <div className="relative w-full h-[300px] border-2 border-gray-200 p-2 rounded-sm">
                  <Image
                    src={imageSj!}
                    alt="Captured"
                    fill
                    unoptimized
                    className="p-2"
                    style={{ objectFit: "cover" }}
                  />
                </div>
              </>
            )}

            {/* Preview Penerima (hanya non-dispatch) */}
            {!isDispatch && imagePackage && (
              <>
                <label className="block mt-2 text-sm font-medium text-gray-700 text-center">
                  Gambar Foto Penerima
                </label>
                <div className="relative w-full h-[300px] border-2 border-gray-200 p-2 rounded-sm">
                  <Image
                    src={imagePackage}
                    alt="Captured"
                    fill
                    unoptimized
                    className="p-2"
                    style={{ objectFit: "cover" }}
                  />
                </div>
              </>
            )}

            {/* Preview Dispatch */}
            {showDispatchPreview && (
              <>
                <label className="block mt-2 text-sm font-medium text-gray-700 text-center">
                  Gambar Foto Dispatch
                </label>
                <div className="relative w-full h-[300px] border-2 border-gray-200 p-2 rounded-sm">
                  <Image
                    src={imageDispatch}
                    alt="Captured"
                    fill
                    unoptimized
                    className="p-2"
                    style={{ objectFit: "cover" }}
                  />
                </div>
              </>
            )}


            <div className="h-2" />

            {!isDispatch && imagePackage && (
              <>
                <label className="block mt-2 text-sm font-medium text-gray-700 text-center">
                  Gambar Foto Penerima
                </label>
                <div className="relative w-full h-[300px] border-2 border-gray-200 p-2 rounded-sm">
                  <Image
                    src={imagePackage}
                    alt="Captured"
                    fill
                    unoptimized
                    className="p-2"
                    style={{ objectFit: "cover" }}
                  />
                </div>
              </>
            )}

            <div className="h-2" />

            {!isDriver && imageDispatch && (
              <>
                <label className="block mt-2 text-sm font-medium text-gray-700 text-center">
                  Gambar Foto Dispatch
                </label>
                <div className="relative w-full h-[300px] border-2 border-gray-200 p-2 rounded-sm">
                  <Image
                    src={imageDispatch}
                    alt="Captured"
                    fill
                    unoptimized
                    className="p-2"
                    style={{ objectFit: "cover" }}
                  />
                </div>
              </>
            )}

            <div className="h-4" />
            <Button
              className="w-[50%] sm:w-[25%]"
              variant="contained"
              color="error"
              startIcon={<SaveAsOutlined />}
              type="submit"
              disabled={isLoading}
            >
              Simpan
            </Button>
          </form>
        </div>
      )}
      {!isLogin && (
        <div className="py-4 px-4 sm:px-96 pt-20">
          <div className="text-center">
            <p className="text-2xl font-bold">Loading...</p>
          </div>
        </div>
      )}
    </div>
  );
}
