# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import Command
from odoo.addons.project.tests.test_project_base import TestProjectCommon
from odoo.tests import Form


class TestProjectTaskQuickCreate(TestProjectCommon):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.user1, cls.user2 = cls.env['res.users'].with_context({'no_reset_password': True}).create([{
            'name': 'Raouf 1',
            'login': 'raouf1',
            'password': 'raouf1aa',
            'email': 'raouf1@example.com',
        }, {
            'name': 'Raouf 2',
            'login': 'raouf2',
            'password': 'raouf2aa',
            'email': 'raouf2@example.com',
        }])

    def test_create_task_with_valid_expressions(self):
        # dict format = {display name: (expected name, expected tags count, expected users count, expected priority, expected planned hours)}
        valid_expressions = {
            'task A 30H 2.5h #Tag1 #tag2 @Armande @Bast @raouf1 @raouf2 !': ('task A 30H 2.5h', 2, 4, "1", 0),
            'task A 30H 2.5h #Tag1 #tag2 #tag3 @Armande @Bast @raouf1 ! @raouf2': ('task A 30H 2.5h', 3, 4, "1", 0),
            'task A ! 30H 2.5h #Tag1 #tag2 #tag3 @Armande @Bast ! @raouf1 #tag4': ('task A 30H 2.5h', 4, 3, "1", 0),
            'task A': ('task A', 0, 0, "0", 0),
            'task A !': ('task A', 0, 0, "1", 0),
            'task A 30H   2.5h #Tag1 #tag2     #tag3    @Armande      @Bast @raouf1 @raouf2': ('task A 30H   2.5h', 3, 4, "0", 0),
            'task A 30H 2.5h #Tag1 @Armande #tag3 @Bast @raouf1 #tag2 @raouf2 #tag4': ('task A 30H 2.5h', 4, 4, "0", 0),
            'task A 30H #tag1 @raouf1 Nothing !': ('task A 30H #tag1 @raouf1 Nothing', 0, 0, '1', 0),
            'task A 30H 2.5h #Tag1 #tag2 #tag3 @Armande @Bast @raouf !': ('task A 30H 2.5h @raouf', 3, 2, "1", 0),
            'task A 30H 2.5h #Tag1 #tag2 #tag3 @Armande @Bastttt @raouf1 @raouf2 !': ('task A 30H 2.5h @Bastttt', 3, 3, "1", 0),
            'task A 30H 2.5h #TAG1 #tag1 #TAG2': ('task A 30H 2.5h', 2, 0, "0", 0),
            'task A 30H 2.5h #Tag1 #tag2 @Armande @Bast @raouf1 @raouf2 !!': ('task A 30H 2.5h', 2, 4, "2", 0),
            'task A !!': ('task A', 0, 0, "2", 0),
            'task A 30H 2.5h #Tag1 #tag2 #tag3 @Armande @Bastttt @raouf1 @raouf2 !!': ('task A 30H 2.5h @Bastttt', 3, 3, "2", 0),
            'task A 30H 2.5h #Tag1 #tag2 @Armande @Bast @raouf1 @raouf2 !!!': ('task A 30H 2.5h', 2, 4, "3", 0),
            'task A !!!': ('task A', 0, 0, "3", 0),
            'task A 30H 2.5h #Tag1 #tag2 #tag3 @Armande @Bastttt @raouf1 @raouf2 !!!': ('task A 30H 2.5h @Bastttt', 3, 3, "3", 0),
        }

        for expression, values in valid_expressions.items():
            task_form = Form(self.env['project.task'].with_context({'tracking_disable': True, 'default_project_id': self.project_pigs.id}), view="project.quick_create_task_form")
            task_form.display_name = expression
            task = task_form.save()
            results = (task.name, len(task.tag_ids), len(task.user_ids), task.priority, task.allocated_hours)
            self.assertEqual(results, values)

    def test_create_task_with_invalid_expressions(self):
        invalid_expressions = (
            '#tag1 #tag2 #tag3 @Armande @Bast @raouf1 @raouf2',
            '@Armande @Bast @raouf1 @raouf2',
            '!',
            'task A!',
            'task A!!',
            'task A!!!',
            '!!',
            '!!!',
            '!! @Armande',
            '!!! #tag1',
        )

        for expression in invalid_expressions:
            task_form = Form(self.env['project.task'].with_context({'tracking_disable': True, 'default_project_id': self.project_pigs.id}), view="project.quick_create_task_form")
            task_form.display_name = expression
            task = task_form.save()
            results = (task.name, len(task.tag_ids), len(task.user_ids), task.priority, task.allocated_hours)
            self.assertEqual(results, (expression, 0, 0, '0', 0))

    def test_set_stage_on_project_from_task(self):
        new_stage = self.env['project.task.type'].create({
            'name': 'New Stage',
        })
        self.env['project.task'].create({
            'name': 'Test Task',
            'stage_id': new_stage.id,
            'project_id': self.project_pigs.id,
        })
        self.assertEqual(self.project_pigs.type_ids, new_stage, "Task stage is not set in project")

    def test_create_task_with_default_value(self):
        self.project_pigs.write({
            'company_id': self.env.company,
        })
        project_ids = self.env['project.project'].search([]).ids
        self.env['ir.default'].discard_values('project.task', 'project_id', project_ids)
        self.env['ir.default'].set('project.task', 'project_id', self.project_pigs.id)
        field_specs = {'project_id': {}, 'company_id': {'fields': {}}}
        task_values = self.env['project.task'].onchange({}, [], field_specs)['value']
        self.assertEqual(task_values['project_id'], self.project_pigs.id, "The task project_id should be set")

    def test_project_user_task_creation_without_access_error_updates_partner_mobile(self):
        """
        Verify that creating a task with a customer as project user
        raises AccessError due to restricted res.partner rights.
        """
        self.user_projectuser.group_ids = [Command.set([self.env.ref('project.group_project_user').id])]
        self.assertFalse(self.user_projectuser.partner_id.phone)
        test_task = self.env['project.task'].with_user(self.user_projectuser).create({
            'name': 'Test task',
            'project_id': self.project_pigs.id,
            'partner_id': self.user_projectuser.partner_id.id,
            'partner_phone': '1234'
        })

        self.assertTrue(test_task.partner_id, "Customer should be set when creating a task with a partner.")
        self.assertEqual(self.user_projectuser.partner_id.phone, '1234', "Partner phone number should be updated according to the partner_phone field.")
