# Part of Odoo. See LICENSE file for full copyright and licensing details.
from datetime import date
from freezegun import freeze_time

from odoo.tests import tagged

from odoo.addons.hr_holidays.tests.common import TestHrHolidaysCommon


@tagged('post_install', '-at_install', 'accruals')
class TestAccrualAllocations(TestHrHolidaysCommon):
    @classmethod
    def setUpClass(cls):
        super(TestAccrualAllocations, cls).setUpClass()
        cls.leave_type = cls.env['hr.leave.type'].create({
            'name': 'Accrual Time Off',
            'time_type': 'leave',
            'requires_allocation': 'yes',
            'allocation_validation_type': 'no',
        })
        cls.accrual_plan = cls.env['hr.leave.accrual.plan'].with_context(tracking_disable=True).create({
            'name': 'Test Seniority Plan',
            'level_ids': [
                (0, 0, {
                    'start_count': 1,
                    'start_type': 'day',
                    'added_value': 1,
                    'added_value_type': 'day',
                    'frequency': 'yearly',
                    'cap_accrued_time': True,
                    'maximum_leave': 10000,
                }),
                (0, 0, {
                    'start_count': 4,
                    'start_type': 'year',
                    'added_value': 1,
                    'added_value_type': 'day',
                    'frequency': 'yearly',
                    'cap_accrued_time': True,
                    'maximum_leave': 10000,
                }),
                (0, 0, {
                    'start_count': 8,
                    'start_type': 'year',
                    'added_value': 1,
                    'added_value_type': 'day',
                    'frequency': 'yearly',
                    'cap_accrued_time': True,
                    'maximum_leave': 10000,
                }),
            ]
        })

    def _test_past_accrual(self):
        with freeze_time("2023-12-01"):
            allocation = self.env['hr.leave.allocation'].create({
                'employee_id': self.employee_emp_id,
                'allocation_type': 'accrual',
                'accrual_plan_id': self.accrual_plan.id,
                'holiday_status_id': self.leave_type.id,
                'date_from': date(2000, 1, 1),
                'number_of_days': 0,
            })

            allocation._process_accrual_plans()

            self.assertEqual(allocation.number_of_days, 0)