# -*- coding: utf-8 -*-
from datetime import datetime, time

from odoo import api, fields, models


class NacefCompanyDashboard(models.TransientModel):
    """Company home dashboard — computed KPI tiles for the taxpayer.

    Transient: a fresh record is materialised each time the home is opened, so
    the KPIs are always live. Read-only.
    """
    _name = "nacef.company.dashboard"
    _description = "NACEF Company Home Dashboard"

    company_id = fields.Many2one(
        "res.company", required=True, default=lambda s: s.env.company)
    currency_id = fields.Many2one(
        "res.currency", related="company_id.currency_id")

    imdf = fields.Char(compute="_compute_kpis")
    smdf_status = fields.Char(compute="_compute_kpis")
    smdf_connection = fields.Char(compute="_compute_kpis")
    can_sign = fields.Boolean(compute="_compute_kpis")
    offline_tickets = fields.Integer(compute="_compute_kpis")
    cert_days = fields.Integer(compute="_compute_kpis")
    cert_warning = fields.Boolean(compute="_compute_kpis")
    integrity_ok = fields.Boolean(compute="_compute_kpis")
    integrity_label = fields.Char(compute="_compute_kpis")

    today_sales = fields.Monetary(compute="_compute_kpis")
    today_count = fields.Integer(compute="_compute_kpis")
    month_sales = fields.Monetary(compute="_compute_kpis")
    perpetual_total = fields.Monetary(compute="_compute_kpis")

    def _company_imdf(self, company):
        if company.nacef_imdf:
            return company.nacef_imdf
        cfg = self.env["pos.config"].search(
            [("company_id", "=", company.id)], limit=1)
        return cfg.nacef_effective_imdf if cfg else False

    @api.depends("company_id")
    def _compute_kpis(self):
        Order = self.env["pos.order"]
        State = self.env["nacef.smdf.state"]
        Closing = self.env["nacef.fiscal.closing"]
        Audit = self.env["nacef.audit.log"]
        for rec in self:
            company = rec.company_id
            imdf = rec._company_imdf(company)
            rec.imdf = imdf or ""

            state = State.search(
                [("imdf", "=", imdf), ("company_id", "=", company.id)],
                limit=1) if imdf else State
            rec.smdf_status = state.status or "FACTORY"
            rec.smdf_connection = state.connection_state or "Offline"
            rec.can_sign = bool(state.can_sign)
            rec.offline_tickets = state.available_offline_tickets
            rec.cert_days = state.days_to_expiry
            rec.cert_warning = bool(state.renewal_warning)

            today = fields.Date.context_today(rec)
            start = datetime.combine(today, time.min)
            month_start = start.replace(day=1)
            base = [
                ("company_id", "=", company.id), ("nacef_signed", "=", True),
                ("nacef_transaction_type", "=", "SALE"),
                ("nacef_operation_type", "=", "TICKET"),
            ]
            todays = Order.search(base + [("date_order", ">=", start)])
            months = Order.search(base + [("date_order", ">=", month_start)])
            rec.today_sales = sum(todays.mapped("amount_total"))
            rec.today_count = len(todays)
            rec.month_sales = sum(months.mapped("amount_total"))

            if imdf:
                ok, _b = Audit.verify_chain(company=company, imdf=imdf)
            else:
                ok = True
            rec.integrity_ok = ok
            rec.integrity_label = "Intègre" if ok else "Altération détectée"

            closing = Closing.search(
                [("company_id", "=", company.id), ("imdf", "=", imdf),
                 ("state", "=", "closed")],
                order="sequence desc", limit=1) if imdf else Closing
            rec.perpetual_total = closing.perpetual_total

    def action_open_pos(self):
        action = self.env.ref(
            "point_of_sale.action_pos_config_kanban", raise_if_not_found=False)
        if not action:
            return False
        return action.sudo().read()[0]

    def action_open_nacef(self):
        return self.env.ref("nacef_fiscal_core.action_nacef_smdf_state").read()[0]
