import { calculateSalaryTaxParams } from "./types";
import { laws } from "@/data-source";
import { Bracket } from "@/data-source/types";
import { calculateTax, isSupported } from "@/helpers/utils";
import { LawYear } from "@/types/salary";

const calculateYearlySalaryTax = (lawYear: LawYear, yearlySalary: number) => {
    const taxBracket = laws[lawYear].brackets.find(
        (item: Bracket): Bracket | boolean => {
            return isSupported(item, yearlySalary) ? item : false;
        }
    ) as Bracket;

    return calculateTax(taxBracket, yearlySalary);
};

const calculateSalaryTax = ({
    grossSalary,
    socialInsuranceWorkerShare,
    lawYear,
}: calculateSalaryTaxParams) => {
    const monthlyTaxExemption = laws[lawYear].exemptionThreshold / 12;

    const salaryAfterSocialInsurance = grossSalary - socialInsuranceWorkerShare;

    const salaryAfterSocialInsuranceAndExemption =
        salaryAfterSocialInsurance - monthlyTaxExemption;

    const yearlySalary = salaryAfterSocialInsuranceAndExemption * 12;

    const yearlySalaryTax = calculateYearlySalaryTax(lawYear, yearlySalary);

    return yearlySalaryTax / 12;
};

export { calculateSalaryTax };
