import ApiFetch from "@/lib/api-fetch";
import { Prisma } from "@prisma/client";
import { toast } from "react-toastify";
import { proxy } from "valtio";
import { z } from "zod";

const templateTujuanEdukasiForm = z.object({
  judul: z.string().min(3, "Judul minimal 3 karakter"),
  deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"),
});

type TujuanEdukasiForm = Prisma.TujuanEdukasiLingkunganGetPayload<{
  select: {
    id: true;
    judul: true;
    deskripsi: true;
  };
}>;

const stateTujuanEdukasi = proxy({
  findById: {
    data: null as TujuanEdukasiForm | null,
    loading: false,
    initialize() {
      stateTujuanEdukasi.findById.data = {
        id: '',
        judul: '',
        deskripsi: '',
      } as TujuanEdukasiForm;
    },
    async load(id: string) {
      try {
        stateTujuanEdukasi.findById.loading = true;
        const res = await ApiFetch.api.lingkungan.edukasilingkungan.tujuanedukasilingkungan["find-by-id"].get({
          query: { id },
        });
        if (res.status === 200) {
          stateTujuanEdukasi.findById.data = res.data?.data ?? null;
        } else {
          toast.error("Gagal mengambil data tujuan edukasi");
        }
      } catch (error) {
        console.error((error as Error).message);
        toast.error("Terjadi kesalahan saat mengambil data tujuan edukasi");
      } finally {
        stateTujuanEdukasi.findById.loading = false;
      }
    },
  },

  update: {
    loading: false,
    async save(data: TujuanEdukasiForm) {
      const cek = templateTujuanEdukasiForm.safeParse(data);
      if (!cek.success) {
        const errors = cek.error.issues
          .map((issue) => `${issue.path.join(".")}: ${issue.message}`)
          .join(", ");
        toast.error(`Form tidak valid: ${errors}`);
        return;
      }

      try {
        stateTujuanEdukasi.update.loading = true;
        const res = await ApiFetch.api.lingkungan.edukasilingkungan.tujuanedukasilingkungan["update"].post(data);
        if (res.status === 200) {
          toast.success("Data tujuan edukasi berhasil diubah");
          await stateTujuanEdukasi.findById.load(data.id);
        } else {
          toast.error("Gagal mengubah data tujuan edukasi");
        }
      } catch (error) {
        console.error((error as Error).message);
        toast.error("Terjadi kesalahan saat mengubah data tujuan edukasi");
      } finally {
        stateTujuanEdukasi.update.loading = false;
      }
    },
  },
});

const templateMateriEdukasiLingkunganForm = z.object({
    judul: z.string().min(3, "Judul minimal 3 karakter"),
    deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"),
  });
  
  type MateriEdukasiLingkunganForm = Prisma.MateriEdukasiLingkunganGetPayload<{
    select: {
      id: true;
      judul: true;
      deskripsi: true;
    };
  }>;
  
  const stateMateriEdukasiLingkungan = proxy({
    findById: {
      data: null as MateriEdukasiLingkunganForm | null,
      loading: false,
      initialize() {
        stateMateriEdukasiLingkungan.findById.data = {
          id: '',
          judul: '',
          deskripsi: '',
        } as MateriEdukasiLingkunganForm;
      },
      async load(id: string) {
        try {
          stateMateriEdukasiLingkungan.findById.loading = true;
          const res = await ApiFetch.api.lingkungan.edukasilingkungan.materiedukasilingkungan["find-by-id"].get({
            query: { id },
          });
          if (res.status === 200) {
            stateMateriEdukasiLingkungan.findById.data = res.data?.data ?? null;
          } else {
            toast.error("Gagal mengambil data materi edukasi");
          }
        } catch (error) {
          console.error((error as Error).message);
          toast.error("Terjadi kesalahan saat mengambil data materi edukasi");
        } finally {
          stateMateriEdukasiLingkungan.findById.loading = false;
        }
      },
    },
  
    update: {
      loading: false,
      async save(data: MateriEdukasiLingkunganForm) {
        const cek = templateMateriEdukasiLingkunganForm.safeParse(data);
        if (!cek.success) {
          const errors = cek.error.issues
            .map((issue) => `${issue.path.join(".")}: ${issue.message}`)
            .join(", ");
          toast.error(`Form tidak valid: ${errors}`);
          return;
        }
  
        try {
          stateMateriEdukasiLingkungan.update.loading = true;
          const res = await ApiFetch.api.lingkungan.edukasilingkungan.materiedukasilingkungan["update"].post(data);
          if (res.status === 200) {
            toast.success("Data materi edukasi berhasil diubah");
            await stateMateriEdukasiLingkungan.findById.load(data.id);
          } else {
            toast.error("Gagal mengubah data materi edukasi");
          }
        } catch (error) {
          console.error((error as Error).message);
          toast.error("Terjadi kesalahan saat mengubah data materi edukasi");
        } finally {
          stateMateriEdukasiLingkungan.update.loading = false;
        }
      },
    },
  });

  const templateContohEdukasiLingkunganForm = z.object({
    judul: z.string().min(3, "Judul minimal 3 karakter"),
    deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"),
  });
  
  type ContohEdukasiLingkunganForm = Prisma.ContohEdukasiLingkunganGetPayload<{
    select: {
      id: true;
      judul: true;
      deskripsi: true;
    };
  }>;
  
  const stateContohEdukasiLingkungan = proxy({
    findById: {
      data: null as ContohEdukasiLingkunganForm | null,
      loading: false,
      initialize() {
        stateContohEdukasiLingkungan.findById.data = {
          id: '',
          judul: '',
          deskripsi: '',
        } as ContohEdukasiLingkunganForm;
      },
      async load(id: string) {
        try {
          stateContohEdukasiLingkungan.findById.loading = true;
          const res = await ApiFetch.api.lingkungan.edukasilingkungan.contohkegiatandesa["find-by-id"].get({
            query: { id },
          });
          if (res.status === 200) {
            stateContohEdukasiLingkungan.findById.data = res.data?.data ?? null;
          } else {
            toast.error("Gagal mengambil data contoh edukasi");
          }
        } catch (error) {
          console.error((error as Error).message);
          toast.error("Terjadi kesalahan saat mengambil data contoh edukasi");
        } finally {
          stateContohEdukasiLingkungan.findById.loading = false;
        }
      },
    },
  
    update: {
      loading: false,
      async save(data: ContohEdukasiLingkunganForm) {
        const cek = templateContohEdukasiLingkunganForm.safeParse(data);
        if (!cek.success) {
          const errors = cek.error.issues
            .map((issue) => `${issue.path.join(".")}: ${issue.message}`)
            .join(", ");
          toast.error(`Form tidak valid: ${errors}`);
          return;
        }
  
        try {
          stateContohEdukasiLingkungan.update.loading = true;
          const res = await ApiFetch.api.lingkungan.edukasilingkungan.contohkegiatandesa["update"].post(data);
          if (res.status === 200) {
            toast.success("Data contoh edukasi berhasil diubah");
            await stateContohEdukasiLingkungan.findById.load(data.id);
          } else {
            toast.error("Gagal mengubah data contoh edukasi");
          }
        } catch (error) {
          console.error((error as Error).message);
          toast.error("Terjadi kesalahan saat mengubah data contoh edukasi");
        } finally {
          stateContohEdukasiLingkungan.update.loading = false;
        }
      },
    },
  });


const stateEdukasiLingkungan = proxy({
    stateTujuanEdukasi,
    stateMateriEdukasiLingkungan,
    stateContohEdukasiLingkungan
})
  

export default stateEdukasiLingkungan;
