# -*- coding: utf-8 -*-
from odoo.tests.common import TransactionCase


class TestEstimateWizard(TransactionCase):

    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.project = cls.env['project.project'].create({'name': 'Проект для сметы'})
        cls.code = cls.env['hg.index.code'].create({'name': 'Код сметы'})
        cls.index = cls.env['hg.index'].create({
            'name': 'Показатель сметы',
            'internal_code_id': cls.code.id,
        })
        cls.template = cls.env['hg.templates'].create({'name': 'Шаблон сметы'})
        cls.env['hg.templates.line'].create({
            'template_id': cls.template.id,
            'index_id': cls.index.id,
            'date_due': '2025-06-30',
            'value_float_plan': 300000.0,
        })

    def _create_task(self, name='Задача сметы'):
        return self.env['project.task'].create({
            'name': name,
            'project_id': self.project.id,
        })

    def test_confirm_action_creates_index_and_value(self):
        task = self._create_task()
        wizard = self.env['estimate.wizard'].with_context(active_id=task.id).create({
            'template_id': self.template.id,
            'code_id': self.code.id,
        })
        wizard.confirm_action()

        # Должен создаться показатель, привязанный к узлу задачи
        indexes = self.env['hg.index'].search([('node_id', '=', task.node_id.id)])
        self.assertTrue(indexes, 'Показатель должен быть создан для узла задачи')

        # Должно создаться значение для каждого показателя
        for index in indexes:
            values = self.env['hg.value'].search([('index_id', '=', index.id)])
            self.assertTrue(values, 'Значение должно быть создано для показателя')

    def test_confirm_action_value_plan_matches_template(self):
        task = self._create_task('Задача проверки плана')
        wizard = self.env['estimate.wizard'].with_context(active_id=task.id).create({
            'template_id': self.template.id,
            'code_id': self.code.id,
        })
        wizard.confirm_action()

        indexes = self.env['hg.index'].search([('node_id', '=', task.node_id.id)])
        value = self.env['hg.value'].search([('index_id', 'in', indexes.ids)], limit=1)
        self.assertEqual(value.value_float_plan, 300000.0)
        self.assertEqual(str(value.date_due), '2025-06-30')

    def test_confirm_action_returns_close(self):
        task = self._create_task('Задача закрытия')
        wizard = self.env['estimate.wizard'].with_context(active_id=task.id).create({
            'template_id': self.template.id,
            'code_id': self.code.id,
        })
        result = wizard.confirm_action()
        self.assertEqual(result['type'], 'ir.actions.act_window_close')

    def test_confirm_action_without_active_id(self):
        wizard = self.env['estimate.wizard'].create({
            'template_id': self.template.id,
            'code_id': self.code.id,
        })
        # Без active_id в контексте — должен вернуть None без ошибок
        result = wizard.confirm_action()
        self.assertIsNone(result)
