from odoo import fields, models, api


class IrActionsReport(models.Model):
    _inherit = "ir.actions.report"

    report_type = fields.Selection(
        selection_add=[("qweb-xml", "XML")], ondelete={"qweb-xml": "set default"}
    )
    xsd_schema = fields.Binary(
        string="XSD Validation Schema",
        attachment=True,
        help="File with XSD Schema for checking content of result report. Can be empty "
        "if validation is not required.",
    )
    xml_encoding = fields.Selection(
        selection=[
            ("WINDOWS-1251", "WINDOWS-1251")  # will be used as default even if nothing is selected
        ],
        string="XML Encoding",
        help=(
            "Encoding for XML reports. If nothing is selected, "
            "then UTF-8 will be applied."
        ),
    )
    xml_declaration = fields.Boolean(
        string="XML Declaration",
        help=(
            """Add `<?xml encoding="..." version="..."?>` at the start """
            """of final report file."""
        ),
        default=True,
    )
    xml_extension = fields.Char(
        default="xml",
        help="Extension for XML Reports, by default is `xml`",
    )

    @api.model
    def _render_qweb_xml(self, report_ref, res_ids, data=None):
        """
        Call `generate_report` method of report abstract class
        `report.<report technical name>` or of standard class for XML report
        rendering - `report.report_xml.abstract`

        Args:
         * docids(list) - IDs of instances for those report will be generated
         * data(dict, None) - variables for report rendering

        Returns:
         * str - result content of report
         * str - type of result content
        """
        report = self._get_report(report_ref)
        report_model = self.env.get(
            f"report.{report.report_name}", self.env["report.upd_xml.abstract"]
        )
        return report_model.generate_report(
            ir_report=report,  # will be used to get settings of report
            docids=res_ids,
            data=data or {},
        )
