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

from odoo import fields, models, tools, api


class BudgetHrsAnalysis(models.Model):

    _name = "project.budget.hrs.report"
    _description = "Project budget hours analysis report"
    #_order = 'project_id'
    _auto = False

    #analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', readonly=True)
    project_id = fields.Many2one('project.project', string='Project', readonly=True)
    parent_project = fields.Many2one('project.project', string='Parent Project', readonly=True)
    #is_sub_project = fields.Boolean("Is Sub Project", readonly=True)
    #sub_project = fields.Many2one('project.project', string='Sub Project', readonly=True)
    start_date = fields.Date(string='Start Date', readonly=True)
    end_date = fields.Date(string='End Date', readonly=True)
    partner_id = fields.Many2one('res.partner', string='Client', readonly=True)
    employee_id = fields.Many2one('hr.employee', string='Consultant', readonly=True)
    hours_type = fields.Char(string="Hours Type", readonly=True)
    hours = fields.Float("Number of Hours", digits=(16, 2), readonly=True, group_operator="sum")
    #timeline = fields.Float("Timeline", digits=(16, 2), readonly=True, group_operator="sum")
    pricing_type = fields.Selection([
        ('fixed_rate', 'Fixed rate'),
        ('employee_rate', 'Consultant rate')
    ], string="Pricing", readonly=True)
    project_type = fields.Selection([
        ('hours_in_consultant', 'Hours are budgeted according to a consultant'),
        ('hours_no_limit', 'Total hours are budgeted without division to consultant'),
    ], string="Project Type", readonly=True)
    #timesheet_date = fields.Date(string='Timesheet Date', readonly=True)
    #budgeted_hours = fields.Float("Budgeted Hours", digits=(16, 2), readonly=True, group_operator="sum")
    #actual_hours = fields.Float("Actual Hours", digits=(16, 2), readonly=True, group_operator="sum")

    """@api.model
    def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
        res = super().read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy)
        for a in res:
            print("A",a)
        return res"""

    def init(self):
        '''Create the view'''
        tools.drop_view_if_exists(self._cr, self._table)
        self._cr.execute("""
        CREATE OR REPLACE VIEW %s AS (
        SELECT
         ROW_NUMBER() OVER() as id,
         project_id,
         parentproject as parent_project,
         startdate as start_date,
         enddate as end_date,
         pricing_type as pricing_type,
         project_type as project_type,
         partner_id,
         employee_id,
         hours_type,
         hours
         --timeline
        from (
             SELECT
              pro.id AS project_id,
              (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject,
              pro_emp.employee_id AS employee_id,
              date_start AS startdate,
              date AS enddate,
              'Budgeted Hours' as hours_type,
              pro_emp.budgeted_qty as hours,
              --pro_emp.budgeted_qty/8 as timeline,
              --(date - date_start) as timeline,
              pro.*
            FROM
              project_project PRO
              Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id
            Where
              pro.active = 't'
              and PRO.pricing_type = 'employee_rate' and PRO.project_type = 'hours_in_consultant'
        Union all
              SELECT
              pro.id AS project_id,
              (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject,
              null::int AS employee_id,
              date_start AS startdate,
              date AS enddate,
              'Budgeted Hours' as hours_type,
              pro.budgeted_hours2 as hours,
              --(date - date_start) as timeline,
              --pro.budgeted_hours2/8 as timeline,
              pro.*
            FROM
              project_project PRO
              --Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id
            Where
              pro.active = 't'
              and PRO.pricing_type = 'employee_rate' and PRO.project_type = 'hours_no_limit'
        Union all
            SELECT
               pro.id AS project_id,
               (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject,
               AAL.employee_id AS employee_id,
               coalesce(pro.date_start, (select min(al.start_datetime::date) from account_analytic_line as al where pro.id=al.project_id)) AS startdate,
               (select max(al.end_datetime::date) from account_analytic_line as al) as enddate,
               'Actual Hours' as hours_type,
               unit_amount as hours,
               --unit_amount/8 as timeline,
               --(select max(al.end_datetime::date) from account_analytic_line as al) -
               --coalesce(pro.date_start, (select min(al.start_datetime::date) from account_analytic_line as al where pro.id=al.project_id)) AS timeline,
               pro.*
               FROM project_project PRO
               Left JOIN project_sale_line_employee_map pro_emp ON pro_emp.project_id = pro.id
               LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id
               LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id and AAL.employee_id = pro_emp.employee_id
            Where
              PRO.active = 't'
              and PRO.pricing_type = 'employee_rate' and PRO.project_type = 'hours_in_consultant' and AAL.employee_id is not null
        Union all
            SELECT
               pro.id AS project_id,
               (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject,
               AAL.employee_id AS employee_id,
               coalesce(pro.date_start, (select min(al.start_datetime::date) from account_analytic_line as al where pro.id=al.project_id)) AS startdate,
              (select max(al.end_datetime::date) from account_analytic_line as al) as enddate,
               'Actual Hours' as hours_type,
               unit_amount as hours,
               --unit_amount/8 as timeline,
               --(select max(al.end_datetime::date) from account_analytic_line as al) -
               --(select min(al.start_datetime::date) from account_analytic_line as al where pro.id=al.project_id) AS timeline,
               pro.*
               FROM project_project PRO
               LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id
               LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id
            Where
              PRO.active = 't'
              and PRO.pricing_type = 'employee_rate' and PRO.project_type = 'hours_no_limit' and AAL.employee_id is not null
        Union all
            SELECT
               pro.id AS project_id,
               (select project_id from project_subproject_rel as par where pro.id=par.id limit 1) as parentproject,
               AAL.employee_id AS employee_id,
               pro.date_start AS startdate,
              (select max(al.end_datetime::date) from account_analytic_line as al) as enddate,
               'Actual Hours' as hours_type,
               unit_amount as hours,
               --unit_amount/8 as timeline,
               --(select max(al.end_datetime::date) from account_analytic_line as al) - pro.date_start AS timeline,
               --DATE_PART('day', AGE(select max(al.end_datetime::date) from account_analytic_line, pro.date_start)) AS timeline,
               pro.*
               FROM project_project PRO
               LEFT JOIN account_analytic_account AA ON PRO.analytic_account_id = AA.id
               LEFT JOIN account_analytic_line AAL ON AAL.account_id = AA.id and AAL.project_id = PRO.id
            Where
              PRO.active = 't'
              and PRO.pricing_type = 'fixed_rate'
              ) as res
               order by
              project_id desc,
              start_date,
              end_date,
              pricing_type,
              project_type,
              hours_type asc,
              employee_id
        )""" % (self._table,))


