# -*- coding: utf-8 -*-
from odoo import api, fields, models


class SoHelpdeskDashboard(models.TransientModel):
    _name = 'so.helpdesk.dashboard'
    _description = 'Helpdesk Dashboard'

    open_count = fields.Integer(compute='_compute_stats')
    closed_count = fields.Integer(compute='_compute_stats')
    archived_count = fields.Integer(compute='_compute_stats')
    escalated_count = fields.Integer(compute='_compute_stats')
    needs_escalation_count = fields.Integer(compute='_compute_stats')
    avg_rating = fields.Float(compute='_compute_stats', digits=(16, 2))
    rating_count = fields.Integer(compute='_compute_stats')
    rating_1_count = fields.Integer(compute='_compute_stats')
    rating_2_count = fields.Integer(compute='_compute_stats')
    rating_3_count = fields.Integer(compute='_compute_stats')
    recent_activity_ids = fields.Many2many(
        comodel_name='mail.message',
        compute='_compute_stats',
    )
    escalated_ticket_ids = fields.Many2many(
        comodel_name='so.helpdesk.ticket',
        compute='_compute_stats',
    )

    @api.depends()
    def _compute_stats(self):
        Ticket = self.env['so.helpdesk.ticket'].sudo()
        Message = self.env['mail.message'].sudo()
        for dashboard in self:
            dashboard.open_count = Ticket.search_count([
                ('active', '=', True), ('is_closed', '=', False),
            ])
            dashboard.closed_count = Ticket.search_count([
                ('active', '=', True), ('is_closed', '=', True),
            ])
            dashboard.archived_count = Ticket.search_count([('active', '=', False)])
            dashboard.escalated_count = Ticket.search_count([
                ('is_escalated', '=', True), ('active', '=', True),
            ])
            dashboard.needs_escalation_count = Ticket.search_count([
                ('active', '=', True),
                ('is_closed', '=', False),
                ('is_escalated', '=', False),
                '|', ('sla_fail', '=', True), ('priority', '=', '3'),
            ])
            rated = Ticket.search([('rating', '!=', False)])
            dashboard.rating_count = len(rated)
            if rated:
                scores = [int(r.rating) for r in rated]
                dashboard.avg_rating = sum(scores) / len(scores)
                dashboard.rating_1_count = scores.count(1)
                dashboard.rating_2_count = scores.count(2)
                dashboard.rating_3_count = scores.count(3)
            else:
                dashboard.avg_rating = 0.0
                dashboard.rating_1_count = 0
                dashboard.rating_2_count = 0
                dashboard.rating_3_count = 0
            dashboard.recent_activity_ids = Message.search([
                ('model', '=', 'so.helpdesk.ticket'),
                ('message_type', 'in', ('comment', 'email', 'notification')),
            ], order='date desc', limit=25)
            dashboard.escalated_ticket_ids = Ticket.search([
                ('is_escalated', '=', True), ('active', '=', True),
            ], order='escalated_date desc', limit=10)

    def action_open_open_tickets(self):
        return self._ticket_action('Open Tickets', [('active', '=', True), ('is_closed', '=', False)])

    def action_open_closed_tickets(self):
        return self._ticket_action('Closed Tickets', [('active', '=', True), ('is_closed', '=', True)])

    def action_open_archived_tickets(self):
        return self._ticket_action('Archived Tickets', [('active', '=', False)])

    def action_open_escalated_tickets(self):
        return self._ticket_action('Escalated Tickets', [
            ('is_escalated', '=', True), ('active', '=', True),
        ])

    def action_open_needs_escalation(self):
        return self._ticket_action('Needs Escalation', [
            ('active', '=', True),
            ('is_closed', '=', False),
            ('is_escalated', '=', False),
            '|', ('sla_fail', '=', True), ('priority', '=', '3'),
        ])

    def action_open_rated_tickets(self):
        return self._ticket_action('Rated Tickets', [('rating', '!=', False)])

    def _ticket_action(self, name, domain):
        return {
            'type': 'ir.actions.act_window',
            'name': name,
            'res_model': 'so.helpdesk.ticket',
            'view_mode': 'kanban,tree,form,activity',
            'domain': domain,
            'context': {'search_default_open': 0},
        }
