# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).

from datetime import datetime

from dateutil import relativedelta

from odoo.exceptions import ValidationError
from odoo.tests import common


class TestHrPayrollCancel(common.TransactionCase):
    def setUp(self):
        super(TestHrPayrollCancel, self).setUp()
        # Set system parameter
        self.env["ir.config_parameter"].sudo().set_param(
            "payroll.allow_cancel_payslips", True
        )
        self.payslip_action_id = self.ref("payroll.hr_payslip_menu")
        self.res_partner_bank = self.env["res.partner.bank"].create(
            {
                "acc_number": "001-9876543-21",
                "partner_id": self.ref("base.res_partner_12"),
                "acc_type": "bank",
                "bank_id": self.ref("base.res_bank_1"),
            }
        )
        self.hr_employee_anita = self.env.ref("hr.employee_mit")
        self.hr_structure_marketing_executive = self.ref("payroll.structure_001")
        self.hr_contract_anita = self.env.ref("hr_contract.hr_contract_mit")
        self.hr_payslip = self.env["hr.payslip"].create(
            {
                "employee_id": self.hr_employee_anita.id,
            }
        )

    def test_refund_sheet(self):
        hr_payslip = self._create_payslip()
        hr_payslip.action_payslip_done()
        hr_payslip.refund_sheet()
        with self.assertRaises(ValidationError):
            hr_payslip.action_payslip_cancel()
        self.assertEqual(hr_payslip.refunded_id.state, "done")
        hr_payslip.refunded_id.action_payslip_cancel()
        self.assertEqual(hr_payslip.refunded_id.state, "cancel")
        self.assertEqual(hr_payslip.state, "done")
        hr_payslip.action_payslip_cancel()
        self.assertEqual(hr_payslip.state, "cancel")

    def _create_payslip(self):
        date_from = datetime.now()
        date_to = datetime.now() + relativedelta.relativedelta(
            months=+2, day=1, days=-1
        )
        res = self.hr_payslip.get_payslip_vals(
            date_from, date_to, self.hr_employee_anita.id
        )
        vals = {
            "struct_id": res["value"]["struct_id"],
            "contract_id": res["value"]["contract_id"],
            "name": res["value"]["name"],
        }
        vals["worked_days_line_ids"] = [
            (0, 0, i) for i in res["value"]["worked_days_line_ids"]
        ]
        vals["input_line_ids"] = [(0, 0, i) for i in res["value"]["input_line_ids"]]
        vals.update({"contract_id": self.hr_contract_anita.id})
        self.hr_payslip.write(vals)
        payslip_input = self.env["hr.payslip.input"].search(
            [("payslip_id", "=", self.hr_payslip.id)]
        )
        payslip_input.write({"amount": 5.0})
        context = {
            "lang": "en_US",
            "tz": False,
            "active_model": "hr.payslip",
            "department_id": False,
            "active_ids": [self.payslip_action_id],
            "section_id": False,
            "active_id": self.payslip_action_id,
        }
        self.hr_payslip.with_context(context).compute_sheet()
        return self.hr_payslip

    def test_action_payslip_cancel(self):
        hr_payslip = self._create_payslip()
        hr_payslip.action_payslip_done()
        hr_payslip.refund_sheet()
        hr_payslip.refunded_id.action_payslip_cancel()
        hr_payslip.action_payslip_cancel()
