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


class TimesheetReportLine(models.AbstractModel):
    """Abstract model backing the Timesheet List QWeb report."""
    _name = 'report.jb_timesheet.report_timesheet_list'
    _description = 'Timesheet List Report'

    @api.model
    def _get_report_values(self, docids, data=None):
        lines = self.env['account.analytic.line'].browse(docids)
        return {
            'doc_ids': docids,
            'doc_model': 'account.analytic.line',
            'docs': lines,
            'data': data or {},
        }


class ProjectBreakdownReport(models.AbstractModel):
    """Abstract model backing the Project Breakdown QWeb report."""
    _name = 'report.jb_timesheet.report_project_breakdown'
    _description = 'Project Breakdown Report'

    @api.model
    def _get_report_values(self, docids, data=None):
        projects = self.env['project.project'].browse(docids)
        report_data = []
        for project in projects:
            tasks = self.env['project.task'].search([
                ('project_id', '=', project.id),
            ])
            task_data = []
            for task in tasks:
                spent = task.effective_hours
                planned = task.allocated_hours
                progress = (spent / planned * 100) if planned > 0 else 0.0
                overrun = max(0.0, spent - planned)
                billable_hours = sum(
                    line.unit_amount
                    for line in task.timesheet_ids
                    if line.is_billable
                )
                task_data.append({
                    'task': task,
                    'planned': planned,
                    'spent': spent,
                    'progress': round(progress, 1),
                    'overrun': overrun,
                    'billable_hours': billable_hours,
                })
            report_data.append({
                'project': project,
                'tasks': task_data,
            })
        return {
            'doc_ids': docids,
            'doc_model': 'project.project',
            'docs': projects,
            'report_data': report_data,
            'data': data or {},
        }


class OfficeTargetReport(models.AbstractModel):
    """Abstract model backing the Office Target QWeb report."""
    _name = 'report.jb_timesheet.report_office_target'
    _description = 'Office Target Report'

    @api.model
    def _get_report_values(self, docids, data=None):
        employees = self.env['hr.employee'].search([
            ('include_in_office_target', '=', True),
        ])

        date_from = data.get('date_from') if data else None
        date_to = data.get('date_to') if data else None

        employee_data = []
        for emp in employees:
            domain = [('employee_id', '=', emp.id), ('is_billable', '=', True)]
            if date_from:
                domain.append(('date', '>=', date_from))
            if date_to:
                domain.append(('date', '<=', date_to))
            lines = self.env['account.analytic.line'].search(domain)
            billed_hours = sum(lines.mapped('unit_amount'))
            target = emp.target_hours or 0.0
            progress = (billed_hours / target * 100) if target > 0 else 0.0
            employee_data.append({
                'employee': emp,
                'target_hours': target,
                'billed_hours': round(billed_hours, 2),
                'progress': round(progress, 1),
            })

        return {
            'doc_ids': docids,
            'doc_model': 'hr.employee',
            'docs': employees,
            'employee_data': employee_data,
            'date_from': date_from,
            'date_to': date_to,
            'data': data or {},
        }


class MyTargetReport(models.AbstractModel):
    """Abstract model backing the My Target QWeb report."""
    _name = 'report.jb_timesheet.report_my_target'
    _description = 'My Target Report'

    @api.model
    def _get_report_values(self, docids, data=None):
        employee = self.env['hr.employee'].search(
            [('user_id', '=', self.env.uid)], limit=1
        )
        date_from = data.get('date_from') if data else None
        date_to = data.get('date_to') if data else None

        billed_hours = 0.0
        line_data = []
        if employee:
            domain = [
                ('employee_id', '=', employee.id),
                ('is_billable', '=', True),
            ]
            if date_from:
                domain.append(('date', '>=', date_from))
            if date_to:
                domain.append(('date', '<=', date_to))
            lines = self.env['account.analytic.line'].search(
                domain, order='date asc'
            )
            billed_hours = sum(lines.mapped('unit_amount'))
            for line in lines:
                line_data.append({
                    'date': line.date,
                    'project': line.project_id.name or '',
                    'task': line.task_id.name or '',
                    'description': line.name or '',
                    'hours': line.unit_amount,
                    'invoiced': line.is_invoiced,
                })

        target = employee.target_hours if employee else 0.0
        progress = (billed_hours / target * 100) if target > 0 else 0.0

        return {
            'doc_ids': docids,
            'doc_model': 'hr.employee',
            'docs': employee,
            'employee': employee,
            'target_hours': target,
            'billed_hours': round(billed_hours, 2),
            'progress': round(progress, 1),
            'line_data': line_data,
            'date_from': date_from,
            'date_to': date_to,
            'data': data or {},
        }
