from odoo import api, fields, models


class XenoEmployeeType(models.Model):
    _name = "xeno.employee.type"
    _description = (
        "Employee type, mirrors XENHR's Employee Types settings page: "
        "each type has a prefix used to auto-generate xeno_employee_code "
        "for new employees created directly in Odoo (e.g. 'FT' -> "
        "FT0001, FT0002, ...). Only fires when an employee is created "
        "with a type set and no code already given, so it never touches "
        "the real HRSystem-imported codes on existing employees."
    )
    _order = "name"

    name = fields.Char(required=True)
    prefix = fields.Char(
        required=True,
        help="Prefix used to auto-generate this type's employee codes, "
             "e.g. 'FT' with 4 code digits -> FT0001.")
    code_digits = fields.Integer(
        string="Code Digits", default=4, required=True,
        help="Number of digits the sequence number is zero-padded to.")
    next_number = fields.Integer(
        default=1, required=True,
        help="Next sequence number to assign for this type. "
             "Auto-increments every time a code is generated.")
    active = fields.Boolean(default=True)
    code_format_preview = fields.Char(
        string="Code Format", compute="_compute_code_format_preview",
        help="Preview of the next two codes this type would generate.")

    _prefix_unique = models.Constraint(
        "UNIQUE(prefix)", "Prefix must be unique across employee types.")
    _code_digits_positive = models.Constraint(
        "CHECK(code_digits > 0)", "Code digits must be at least 1.")
    _next_number_positive = models.Constraint(
        "CHECK(next_number > 0)", "Next number must be at least 1.")

    @api.depends("prefix", "code_digits", "next_number")
    def _compute_code_format_preview(self):
        for rec in self:
            if not rec.prefix or not rec.code_digits:
                rec.code_format_preview = ""
                continue
            first = "%s%0*d" % (rec.prefix, rec.code_digits, rec.next_number)
            second = "%s%0*d" % (rec.prefix, rec.code_digits, rec.next_number + 1)
            rec.code_format_preview = "%s, %s, ..." % (first, second)

    def _compute_display_name(self):
        for rec in self:
            rec.display_name = "%s (%s)" % (rec.name, rec.prefix)

    def _xeno_next_code(self):
        """Assign and consume the next code for this type. Not
        re-entrant-safe across concurrent transactions (no row lock) --
        acceptable here since new-employee creation is a rare, HR-driven,
        one-at-a-time action, not a high-concurrency path."""
        self.ensure_one()
        code = "%s%0*d" % (self.prefix, self.code_digits, self.next_number)
        self.next_number += 1
        return code
