"use client";
import { useLang } from "@/lib/lang";
import { useAccess } from "@/lib/access";
import { BackBtn, Box, Input, Button, ButtonContainer, CourseToolsBtn } from "@/Theme/Midone/Forms";
import { YearGroupFilter } from "@/Components/Public/YearGroupFilter";
import { Grid, Frame, useData, FeatherIcon } from "@/Theme/Midone/Utils";
import { useEffect, useRef, useState, useCallback, useMemo } from "react";
import Link from "next/link";
import { usePathname, useRouter } from "next/navigation";
import { useConfig, useUtility } from "@/lib";
import { Select } from "@/Theme/Midone/Forms/Select";

export function Page({ laraPath, nextPath, formUrl, formUrl2=null, course=0, baseGroup="", baseYear="" }) {
    const { Lang,local } = useLang();
    const menuPath = usePathname().split('/').includes('myCourses') ? 'myCourses' : 'courses';
    const { destroy, getNeedles, get } = useData();
    const router = useRouter();
    const { componentPermission, checkPermission } = useAccess();
    const accessStroe = checkPermission("quiz.store");
    const accessReport = checkPermission("quiz.store");
    const isAdmin = checkPermission("quiz.store");
    const toolsFilters = checkPermission("toolsFilters.index");
    // componentPermission(`quiz.list`);
    const back = () => router.back();
    // const [params, setParams] = useState({ semester: baseYear, group: baseGroup, menuPath:menuPath });
    const [params, setParams] = useState({ semester: baseYear, group: baseGroup, date:"", hour:"", code:"", menuPath:menuPath });
    
    if(baseGroup != "" && baseYear != "") params['flagReport'] = true;

    let [url, setUrl] = useState(laraPath + "/quiz-list/" + course);
    const [needles, setNeedles] = useState();
    const effectRan = useRef(false);
    const { mediaPath } = useConfig();
    const { getYearSemester, getGroupCode } = useUtility();

    const handleFilterChange = (e, filter) => {
      setParams(prev => ({ ...prev, [filter]: e.target.value,
        page: 1 // تغییر صفحه به ۱ بعد از فیلتر
       }));
    };

    useEffect(() => {
        if (!effectRan.current) {
            getNeedles(`${laraPath}/quiz/get-needles?course=${course}`, setNeedles);
            effectRan.current = true;
        }
    }, [getNeedles, laraPath]);

    const urlItems = useMemo(() => {
        params['code'] = window.$('#codeSearch').val();
        params['date'] = window.$('#dateSearch').val();
        return Object.keys(params)
            .filter(key => params[key])
            .map(key => `${key}=${params[key]}`)
            .join("&");
    }, [params]);

    useEffect(() => {
        setUrl(`${laraPath}/quiz-list/${course}?${urlItems}`);
    }, [urlItems, laraPath]);

    const filterList = useCallback((e, filter) => {
        setParams((prevParams) => ({ ...prevParams, [filter]: e.target.value }));
    }, []);

    const clearFilter = useCallback(() => {
        // setParams({ semester: "", group: "",date:"",hour:"" });
        setParams({ semester: "", group: "",date:"",hour:"",code:"",menuPath });
        window.$(`input#codeSearch`).val("");
        window.$(`input#dateSearch`).val("");
    }, []);

    // تابع مجزا برای onClick
    const handleClick = useCallback((e, item) => {
        e.preventDefault();
        if (document.getElementById('a-loading')) return;
        e.target.innerHTML = loading + e.target.innerHTML;
        // console.log("item is ", item);
        get(laraPath + "/bbb/" + item?.id, "", "", (data) => {
            // console.log("callback!!");
            let a = document.createElement("a");
            const id = "a-" + Math.random();
            a.href = data.url;
            a.target = "_blank";
            a.id = id;
            document.body.appendChild(a);
            Element.prototype.remove = function () {
                this.parentElement.removeChild(this);
            };
            document.getElementById('a-loading').remove();
            document.getElementById(id).click();
        });
    }, [get, laraPath]);

    const applyReport = useCallback(() => {

        setIsLoading(true); // شروع لودینگ
        getNeedles(`${laraAdmin}/classes/update-student-count`, () => {
            // setUpdate(data);
            setIsLoading(false); // پایان لودینگ
            // reportData();
        });
    }, []);

    const badge = {
        'creator': 'bg-gray-400 text-xs font-medium me-2 px-2.5 py-0.5 rounded',
        'created_at': 'bg-gray-400 text-xs font-medium  px-2.5 py-0.5 rounded text-center',
        'response': 'bg-gray-400 text-blue-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded',
        'corrected': 'bg-gray-400 text-green-800 text-xs font-medium me-2 px-2.5 py-0.5 rounded',
        'totalScore': 'bg-gray-400 text-xs font-medium me-2 px-2.5 py-0.5 rounded',
    }
    
    const info = useMemo(() => ({
        ...(menuPath == "courses" || menuPath == "myCourses") && accessStroe && formUrl2 == null ? { insertLink: formUrl + "/new" } : {},
        perPage: 50,
        url: url,
        columns: [
            // {label: "title",  jsx: (item)=><span>{<Link href={formUrl + "/" + item.id+ "/reply"}>{item.title}</Link> }</span>},
            ...(formUrl2 ? [{ label: "course", jsx: (item) => <span>{item?.course?.title}-{item?.course_id}</span> }] : []),
            // {label: "course", jsx: (item) => <span>{item?.course?.title}-{item?.course_id}</span> },
            {label: "title",  jsx: (item)=><span>{<Link href={`${formUrl}${formUrl2!=null?item.course_id+formUrl2 : ""}/${item.id}/reply`}>{item.title}</Link> }</span>},
            {label: "start", jsx: (item)=><span dir="ltr" >{item?.start_date+" "+item?.start_time}</span>},
            {label: "end", jsx: (item)=><span  dir="ltr">{item?.end_date+" "+item?.end_time}</span>},
            {label: "year_semester", jsx: (item) => getYearSemester(item.group, Lang)},
            {label: "group", minWidth:"110px",  jsx: (item)=>getGroupCode(item.group, Lang)},
            accessReport?{label: "creator", minWidth:"150px", jsx: (item)=>
                <span>
                    <div className={badge["creator"]}>{item?.creator?.firstname+" "+item?.creator?.lastname}</div>
                    <div className={badge["created_at"]} dir="ltr">{item?.created_at}</div>
                </span>
            }:'',
            accessReport?{label: "", minWidth:"150px", jsx: (item)=>
                <span>
                    <div className={badge["response"]}>{Lang("response")+" "+item.answer_count}</div>
                    <div className={badge["corrected"]}>{Lang("corrected")+" "+item.corrected_count}</div>
                    <div className={badge["totalScore"]}> {Lang("total_score")+" "+item.total_score}</div>
                </span>
            }:'',
            {
                label: "",
                sort: false,
                width: "110px",
                jsx: (item) => <>
                    <div className='flex justify-center '>
                        <FeatherIcon name="MessageCircle" url={`${formUrl}${formUrl2!=null?item?.course_id+formUrl2 : ""}/${item.id}/reply`}  tooltip={Lang('public.reply')} /> 
                        <FeatherIcon permission="quiz.correcting" name="CheckSquare" url={`${formUrl}${formUrl2!=null?item.course_id+formUrl2 : ""}/${item.id}/correcting?test=${item.testi_count}`} tooltip={Lang('public.correcting')} />
                        <FeatherIcon name="Eye" url={`${formUrl}${formUrl2!=null?item.course_id+formUrl2 : ""}/${item.id}`} tooltip={Lang('public.view')} />
                        <FeatherIcon permission="quiz.update" name="Edit" url={`${formUrl}${formUrl2!=null?item.course_id+formUrl2 : ""}/${item.id}/edit`} tooltip={Lang('public.edit')} />
                        <FeatherIcon permission="quiz.destroy" name="XOctagon" tooltip={Lang('public.delete')} color="darkred" onClick={() => destroy(laraPath+"/quiz/" + item.id)} />
                    </div>
                </>
            },
        ],
    }), [url, Lang, formUrl, destroy, laraPath, getYearSemester, getGroupCode, handleClick]);
    
    const hours = Array.from({ length: 11 }, (_, i) => {
        const hour = (7 + i).toString().padStart(2, "0") + ":00";
        return { value: hour, label: hour };
    });

    return (
        <Frame title={Lang(["public.quiz"])}>
            <Box shadow={false} minIcon={true} min={true} display={(toolsFilters && baseGroup == "" && baseYear == "")} >
                {/* <YearGroupFilter params={params} needles={needles} Lang={Lang} filterList={filterList} /> */}
                <YearGroupFilter params={params} needles={needles} Lang={Lang} filterList={handleFilterChange} className={formUrl2 == null? "col-span-12 md:col-span-3":"col-span-12 md:col-span-2 lg:col-span-2"} />
                {formUrl2 && (
                    <>
                        <Input
                            onEnter={(e) => handleFilterChange(e, "code")} note={Lang("public.filter_report_classes_course")}
                            defaultValue={params.code}
                            id="codeSearch"
                            dir="ltr"
                            className="col-span-12 md:col-span-2 lg:col-span-2"
                            label="course_search"
                        />
                        <Input
                            onEnter={(e) => handleFilterChange(e, "date")}
                            defaultValue={params.date}
                            id="dateSearch"
                            dir="ltr"
                            className="col-span-12 md:col-span-2 lg:col-span-2"
                            placeholder={local=="fa" ? "1403-01-01":"2026-01-01"}
                            label="start_date"
                        />
                        <Select
                            dir="ltr"
                            defaultValue={params?.hour ? params?.hour : ''}
                            className="col-span-12 md:col-span-2 lg:col-span-2"
                            placeholder="10:00"
                            label="start_hour"
                            onChange={(e) => handleFilterChange(e, "hour")}
                            >
                            {hours.map((h) => (
                                <option key={h.value} value={h.value}>
                                {h.label}
                                </option>
                            ))}
                        </Select>
                    </>  
                )}
                {/* <ButtonContainer className="mt-5 col-span-3"> */}
                <ButtonContainer>
                    <Button
                        label="clear_filter"
                        className="btn btn-secondary w-20 mt-2"
                        onClick={clearFilter}
                    />
                    {/* <Button label="update_student_count" className="btn btn-primary mr-2" onClick={applyReport} /> */}
                </ButtonContainer>
                {/* <ButtonContainer className={formUrl2 ? "m-0" : "mt-5 pt-2"}>
                    <Button label="clear_filter" className="btn btn-secondary w-20" onClick={clearFilter} />
                </ButtonContainer> */}
            </Box>
            <div className="intro-y col-span-12">
                <Grid {...info} key={url} />
                {formUrl2 == null ? 
                    <ButtonContainer>
                        <CourseToolsBtn href={`${nextPath}/${menuPath}/${course}/tools`} />
                        <BackBtn onClick={back} display={(baseGroup == "" || baseYear == "")} />
                    </ButtonContainer>
                :""}
            </div>
        </Frame>
    );
}

const loading = '<svg id="a-loading" style="display: inline-block; margin: 0 6px" width="25" viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="rgb(45, 55, 72)"><circle cx="15" cy="15" r="15"><animate attributeName="r" from="15" to="15" begin="0s" dur="0.8s" values="15;9;15" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="fill-opacity" from="1" to="1" begin="0s" dur="0.8s" values="1;.5;1" calcMode="linear" repeatCount="indefinite"></animate></circle><circle cx="60" cy="15" r="9" fill-opacity="0.3"><animate attributeName="r" from="9" to="9" begin="0s" dur="0.8s" values="9;15;9" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="fill-opacity" from="0.5" to="0.5" begin="0s" dur="0.8s" values=".5;1;.5" calcMode="linear" repeatCount="indefinite"></animate></circle><circle cx="105" cy="15" r="15"><animate attributeName="r" from="15" to="15" begin="0s" dur="0.8s" values="15;9;15" calcMode="linear" repeatCount="indefinite"></animate><animate attributeName="fill-opacity" from="1" to="1" begin="0s" dur="0.8s" values="1;.5;1" calcMode="linear" repeatCount="indefinite"></animate></circle></svg>';
