import { useTokenInfo } from "../../../..";
import { useAuthFactory } from "../../Models/SettingInfo";
import { LoginByUserPass } from "../UserPass/LoginByUserPass";
import { LoginByToken } from "./LoginByToken";

test("request and response of token login", async () => {
    const authFactory = useAuthFactory();
    const tokenInfo = useTokenInfo();
    const loginByUserPass = LoginByUserPass.createNew(authFactory);
    expect(loginByUserPass).toBeTruthy();
    if (!loginByUserPass) {
        return;
    }
    var result = await loginByUserPass.loginAxios("admin", "1", false);

    tokenInfo.removeLocalStorageToken();
    tokenInfo.deserialize(result.token, true);
    expect(tokenInfo.token).toBe(result.token);
    expect(tokenInfo.tokenFromLocalStorage).toBe(true);

    const loginByToken = LoginByToken.createNew(authFactory);

    expect(loginByToken).toBeTruthy();
    if (!loginByToken) {
        return;
    }
    expect(loginByToken.actionPath).toBe('tokenValidation');
    expect(loginByToken.controllerPath).toBe('auth');
    expect(loginByToken.routerPath).toBe('/login');

    expect(tokenInfo.headerOfAxios.headers!.Accept).toBe(loginByToken.authFactory.mainStateManager.tokenInfo.headerOfAxios.headers!.Accept);
    expect(tokenInfo.headerOfAxios.headers!["content-type"]).toBe(loginByToken.authFactory.mainStateManager.tokenInfo.headerOfAxios.headers!["content-type"]);
    expect(tokenInfo.headerOfAxios.headers!.Authorization).toBe(loginByToken.authFactory.mainStateManager.tokenInfo.headerOfAxios.headers!.Authorization);

    var result = await loginByToken.loginAxios();
    expect(result).not.toBeFalsy();
    expect(result).toBeTruthy();

    expect(result.message).toBeFalsy();
    expect(result.message).not.toBeTruthy();

    expect(result.isSuccess).not.toBeFalsy();
    expect(result.isSuccess).toBeTruthy();

    expect(result.token).not.toBeFalsy();
    expect(result.token).toBeTruthy();

    expect(result.data).not.toBeFalsy();
    expect(result.data).toBeTruthy();

    expect(result.data.userInfo).not.toBeFalsy();
    expect(result.data.userInfo).toBeTruthy();

    expect(result.data.fiscalYearsInfo).not.toBeFalsy();
    expect(result.data.fiscalYearsInfo).toBeTruthy();

    expect(result.data.settingInfo).not.toBeFalsy();
    expect(result.data.settingInfo).toBeTruthy();

    expect(result.data.subSystemsInfo).not.toBeFalsy();
    expect(result.data.subSystemsInfo).toBeTruthy();
}, 15000);


test("only token login", async () => {
    const authFactory = useAuthFactory();
    const loginByUserPass = LoginByUserPass.createNew(authFactory);
    const token = useTokenInfo();
    expect(loginByUserPass).toBeTruthy();
    if (!loginByUserPass) {
        return;
    }
    var result = await loginByUserPass.loginAxios("admin", "1", false);

    authFactory.mainStateManager.tokenInfo.removeLocalStorageToken();
    authFactory.mainStateManager.tokenInfo.deserialize(result.token, true);
    expect(authFactory.mainStateManager.tokenInfo.token).toBe(result.token);

    const loginByToken = LoginByToken.createNew(authFactory);

    expect(loginByToken).toBeTruthy();
    if (!loginByToken) {
        return;
    }
    expect(result).not.toBeFalsy();
    expect(result).toBeTruthy();


    expect(loginByToken).toBeTruthy();
    if (!loginByToken) {
        return;
    }

    var tokenResult = await loginByToken.loginAxios();

    if (tokenResult.isSuccess) {
        const authFactory = loginByToken.authFactory;
        expect(tokenResult.token).toBe(tokenResult.token);
        expect(result.token).not.toBe(tokenResult.token);
        expect(authFactory.mainStateManager.tokenInfo.token).not.toBe(result.token);
        expect(authFactory.mainStateManager.userInfo.id).toBe(1);
        expect(authFactory.mainStateManager.userInfo.code).toBe(0);
        expect(authFactory.mainStateManager.userInfo.email).toBe('');
        expect(authFactory.mainStateManager.userInfo.family).toBe('');
        expect(authFactory.mainStateManager.userInfo.image).toBe('');
        expect(authFactory.mainStateManager.userInfo.isAdmin).toBe(true);
        expect(authFactory.mainStateManager.userInfo.isInactive).toBe(false);
        expect(authFactory.mainStateManager.userInfo.mobile).toBe('');
        expect(authFactory.mainStateManager.userInfo.name).toBe('کاربر ارشد');
        expect(authFactory.mainStateManager.userInfo.user).toBe('admin');
        expect(authFactory.mainStateManager.userInfo.isAuthenticated()).toBe(true);

        expect(tokenResult.data.settingInfo.codingHesab.includes(authFactory.mainStateManager.settingInfo.codingHesab.coding) && authFactory.mainStateManager.settingInfo.codingHesab.coding).toBeTruthy();
        expect(tokenResult.data.settingInfo.codingMarkaz1.includes(authFactory.mainStateManager.settingInfo.codingMarkaz1.coding) && authFactory.mainStateManager.settingInfo.codingMarkaz1.coding).toBeTruthy();
        expect(tokenResult.data.settingInfo.codingMarkaz2.includes(authFactory.mainStateManager.settingInfo.codingMarkaz2.coding) && authFactory.mainStateManager.settingInfo.codingMarkaz2.coding).toBeTruthy();
        expect(tokenResult.data.settingInfo.codingMarkaz3.includes(authFactory.mainStateManager.settingInfo.codingMarkaz3.coding) && authFactory.mainStateManager.settingInfo.codingMarkaz3.coding).toBeTruthy();
        expect(tokenResult.data.settingInfo.codingKala.includes(authFactory.mainStateManager.settingInfo.codingKala.coding) && authFactory.mainStateManager.settingInfo.codingKala.coding).toBeTruthy();

        expect(authFactory.mainStateManager.fiscalYearsInfo.activeFiscalYear?.id).toBe(tokenResult.data.fiscalYearsInfo.activeFiscalYearId);
        expect(authFactory.mainStateManager.fiscalYearsInfo.fiscalYears.length).toBe(tokenResult.data.fiscalYearsInfo.fiscalYears.length);

        expect(authFactory.mainStateManager.subSystemsInfo.all.length).toBe(tokenResult.data.subSystemsInfo.all.length);
        expect(authFactory.mainStateManager.subSystemsInfo.all.length > 10).toBeTruthy();


        expect(authFactory.mainStateManager.subSystemsInfo.roled.length).toBe(tokenResult.data.subSystemsInfo.roled.length);
        expect(authFactory.mainStateManager.subSystemsInfo.selected.length).toBe(tokenResult.data.subSystemsInfo.selected.length);
    }

}, 25000);



// test.only("only is authorized token", async () => {
//     const AuthorizedHeadActionPath = 'AuthorizedHead';
//     const authFactory = getLoginByToken(AuthorizedHeadActionPath);
//     expect(authFactory.axiosData.actionTokenValidationPath).toBe(AuthorizedHeadActionPath);
//     const loginByUserPass = LoginByUserPass.createNew(authFactory);
//     expect(loginByUserPass).toBeTruthy();
//     if (!loginByUserPass) {
//         return;
//     }
//     var result = await loginByUserPass.loginAxios("admin", "1", false);

//     tokenInfo.removeLocalStorageToken();
//     tokenInfo.deserialize(result.token, true);
//     expect(tokenInfo.token).toBe(result.token);

//     const loginByToken = LoginByToken.createNew(authFactory);

//     expect(loginByToken).toBeTruthy();
//     if (!loginByToken) {
//         return;
//     }
//     expect(result).not.toBeFalsy();
//     expect(result).toBeTruthy();


//     expect(loginByToken).toBeTruthy();
//     if (!loginByToken) {
//         return;
//     }

//     var tokenResult = await loginByToken.loginAxios();

//     if (tokenResult.isSuccess) {
//         const authFactory = loginByToken.authFactory;
//         expect(tokenResult.token).toBe(tokenResult.token);
//         expect(result.token).not.toBe(tokenResult.token);
//         expect(tokenInfo.token).not.toBe(result.token);
//         expect(authFactory.mainStateManager.userInfo.id).toBe(1);
//         expect(authFactory.mainStateManager.userInfo.code).toBe(0);
//         expect(authFactory.mainStateManager.userInfo.email).toBe('');
//         expect(authFactory.mainStateManager.userInfo.family).toBe('');
//         expect(authFactory.mainStateManager.userInfo.image).toBe('');
//         expect(authFactory.mainStateManager.userInfo.isAdmin).toBe(true);
//         expect(authFactory.mainStateManager.userInfo.isInactive).toBe(false);
//         expect(authFactory.mainStateManager.userInfo.mobile).toBe('');
//         expect(authFactory.mainStateManager.userInfo.name).toBe('کاربر ارشد');
//         expect(authFactory.mainStateManager.userInfo.user).toBe('admin');
//         expect(authFactory.mainStateManager.userInfo.isAuthenticated()).toBe(true);
//     }
// });