"use client";

import { LANGUAGES, OPTION_LOGIN } from '@/lib/appConstant';
import { changeUserEmail, changeUserPassword, getIsAcountLoading, updateUserInfo } from '@/lib/redux/features/account';
import { getIsGoogleLogin, getIsMicrosoftLogin } from '@/lib/redux/features/auth';
import { getAccountType, getPasswordPolicy, getViewSettings } from '@/lib/redux/features/serviceAdmin';
import { useAppDispatch, useAppSelector } from '@/lib/redux/hooks';
import { hashMD5 } from '@/lib/utils';
import { Col, Row } from 'antd';
import { useTranslations } from 'next-intl';
import React, { useEffect, useState } from 'react';
import ChangePasswordModal from '../modal/change-password-modal';
import ChangeEmailModal from '../modal/change-email-modal';
import { z } from 'zod';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { FormItem, FormWrapper } from '../ui/form';
import AppInput from '../ui/input/input';
import AppSelect from '../ui/select';
import { ChangePasswordUserRequest } from '@/types/account';
import InputFieldButtonRight from '../ui/input/input-field-button-right';
import AppCheckbox from '../ui/checkbox';
import AppButton from '../ui/button/app-button';

const UserAccountSettingForm = (props: any) => {
    const {
        accountDetail
    } = props;
    const dispatch = useAppDispatch();

    const isGoogleLogin = useAppSelector(getIsGoogleLogin);
    const isMicrosoftLogin = useAppSelector(getIsMicrosoftLogin);
    const isLoading = useAppSelector(getIsAcountLoading);
    const viewSettings = useAppSelector(getViewSettings);
    const strictPassword = useAppSelector(getPasswordPolicy);
    const accountType = useAppSelector(getAccountType);

    const [showPasswordDialog, setShowPasswordDialog] = useState(false);
    const [languageOptions, setLanguageOptions] = useState<any []>([]);
    const [showEmailResetDialog, setShowEmailResetDialog] = useState(false);

    const t = useTranslations("");
    const { isChangePassword } = viewSettings;

    // const validationSchema = Yup.object().shape({
    //     fullName: Yup.string().trim().required(Util.translate('validate.required')).max(64, Util.translate('validate.max_length_64')).min(2, Util.translate('validate.min_length_2'))
    // });

    /**
     * Handle form submission
     * @param data
     */
    const submit = (data: any) => {
        console.log('data: ', data);
        
        const userRequest: any = {
            id: accountDetail.id,
            fullName: data.fullName,
            lang: data.lang
        };
        if (accountType === OPTION_LOGIN.GAKKEN_ID) {
            userRequest.isSubscribeMail = data.subscribeMail;
        }
        console.log('userRequest: ', userRequest);
        dispatch(updateUserInfo(userRequest));
    };

    /**
     * Handle change password submission
     * @param data
     */
    const changePasswordSubmit = (data: any) => {
        const request: ChangePasswordUserRequest = {
            userId: accountDetail.id,
            oldPass: hashMD5(data.currentPassword),
            newPass: hashMD5(data.newPassword),
            confirmPass: hashMD5(data.confirmPassword)
        };
        dispatch(changeUserPassword(request));
        setShowPasswordDialog(false);
    };

    const changeEmailSubmit = ({ email }) => {
        dispatch(changeUserEmail({
            id: accountDetail.id,
            newEmail: email
        }));
        setShowEmailResetDialog(false);
    };

    useEffect(() => {
        let languages: any [] = [];
        for (const item of LANGUAGES) {
            const language = {
                value: item.value,
                label: t(item.label)
            };
            languages = [...languages, language];
        }
        setLanguageOptions(languages);
    }, [accountDetail]);

    const formSchema = z
        .object({
            fullName: z.string()
                .trim()
                .min(1, { message: t("validate.required") }),
            lang: z.string()
                .trim()
                .min(1, { message: t("validate.required") }),
            subscribeMail: z.boolean()
        });
    
    type SettingsFormSchema = z.infer<typeof formSchema>;
    

    const accountSettingForm = useForm<SettingsFormSchema>({
        resolver: zodResolver(formSchema),
        defaultValues: {
            fullName: '',
            lang: '',
            ...accountDetail,
        }
    });

    const handleClickChangePassword = () => {
        setShowPasswordDialog(true);
    };

    return (
        <React.Fragment>
            <FormWrapper<SettingsFormSchema>
                form={accountSettingForm}
                onSubmit={submit}
                layout="vertical"
                className="space-y-4"
            >
                
                <Row gutter={16} >
                    <Col span={24}>
                        <FormItem name="fullName" label={t("label.name")}>
                            {({ value, ref, ...field }) => (
                                <AppInput
                                    ref={ref}
                                    inputType="default"
                                    value={value}
                                    disabled={accountType === OPTION_LOGIN.GAKKEN_ID}
                                    {...field}
                                    placeholder={t("label.name")}
                                />
                            )}
                        </FormItem>
                    </Col>
                    {
                        accountType !== OPTION_LOGIN.GAKKEN_ID &&
                        <Col span={24}>
                            {
                                accountDetail.email ?
                                <FormItem name="email" label={t("label.email")}>
                                    {({ value, ref, ...field }) => (
                                        <AppInput
                                            ref={ref}
                                            inputType="default"
                                            value={value}
                                            disabled={true}
                                            {...field}
                                            onClick={() => setShowEmailResetDialog(true)}
                                            placeholder={t("label.email")}
                                        />
                                    )}
                                </FormItem>
                                : <FormItem name="username" label={t("label.username")}>
                                    {({ value, ref, ...field }) => (
                                        <AppInput
                                            ref={ref}
                                            inputType="default"
                                            value={value}
                                            disabled={true}
                                            {...field}
                                            placeholder={t("label.username")}
                                        />
                                    )}
                                </FormItem>
                            }
                        </Col>
                    }
                    <Col span={24}>
                        <FormItem name="lang" label={t("label.language")}>
                            {({ value, ref, ...field }) => (
                                <div className="flex items-center gap-2">
                                    <AppSelect
                                        style={{ width: "100%" }}
                                        placeholder={t("label.language")}
                                        value={value}
                                        onChange={(value) => field.onChange(value)}
                                        options={languageOptions}
                                        filterOption={(input, option) =>
                                            (option?.label?.toString() ?? "")
                                            .toLowerCase()
                                            .includes(input.toLowerCase())
                                        }
                                        // dropdownRender={dropdownRender}
                                        virtual={true}
                                        listHeight={250}
                                    />
                                </div>
                            )}
                        </FormItem>
                    </Col>
                    {!isGoogleLogin && !isMicrosoftLogin && accountType !== OPTION_LOGIN.GAKKEN_ID && isChangePassword
                    ?   <Col span={24}>
                            <FormItem name="password" label={t("label.password")}>
                                {({ value, ref, ...field }) => (
                                    <InputFieldButtonRight
                                        // ref={ref}
                                        type="password"
                                        value={value}
                                        disabled={true}
                                        onRightButtonClick={handleClickChangePassword}
                                        {...field}
                                        rightButtonLabel={t('label.change')}
                                        placeholder={'********'}
                                    />
                                )}
                            </FormItem>
                        </Col>
                    :   null
                    }
                    {
                        accountType === OPTION_LOGIN.GAKKEN_ID &&
                        <Col span={24}>
                            <FormItem name="subscribeMail" >
                                {({ value, onChange }) => (
                                     <>
                                        <AppCheckbox value={value} onChange={onChange}/>
                                        <span className="ml-1">{t("label.subscribeMail")}</span>
                                    </>
                                    
                                )}
                            </FormItem>
                        </Col>
                    }
                    <Col span={24}>
                        <AppButton
                            type='submit'
                            color='success'
                            disabled={isLoading}
                            className='w-full'
                            // style={{ backgroundColor: '#00B27B', width: '100%', borderColor: '#00B27B', margin: '10px 0', color: '#fff' }}
                        >
                            {t('button.save')}
                        </AppButton>
                    </Col>
                </Row>
            </FormWrapper>
            <ChangePasswordModal
                isOpen={showPasswordDialog}
                toggle={() => setShowPasswordDialog(false)}
                onSubmit={changePasswordSubmit}
                strictPassword={strictPassword}
            />
            <ChangeEmailModal
                isOpen={showEmailResetDialog}
                toggle={() => setShowEmailResetDialog(false)}
                onSubmit={changeEmailSubmit}
            />
        </React.Fragment>
    );
};


export default UserAccountSettingForm;
