from odoo import models, fields


class EncoachResource(models.Model):
    _name = 'encoach.resource'
    _description = 'Learning Resource'

    name = fields.Char(required=True)
    type = fields.Selection([
        ('video', 'Video'),
        ('pdf', 'PDF'),
        ('document', 'Document'),
        ('link', 'Link'),
        ('interactive', 'Interactive'),
        # Audio + image are surfaced in the Resource Manager table
        # (icons / filters) so we accept them as first-class types
        # rather than coercing them into ``document`` and losing the
        # MIME-correct preview (audio player, <img>, etc.).
        ('audio', 'Audio'),
        ('image', 'Image'),
        ('article', 'Article'),
    ])
    review_status = fields.Selection([
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
    ], default='approved')
    subject_id = fields.Many2one('encoach.subject', ondelete='set null')
    domain_id = fields.Many2one('encoach.domain', ondelete='set null', string='Domain')
    topic_ids = fields.Many2many('encoach.topic')
    learning_objective_ids = fields.Many2many(
        'encoach.learning.objective', 'encoach_resource_obj_rel',
        'resource_id', 'objective_id', string='Learning Objectives',
    )
    tag_ids = fields.Many2many(
        'encoach.resource.tag', 'encoach_resource_tag_rel',
        'resource_id', 'tag_id', string='Tags',
    )
    file = fields.Binary(attachment=True)
    # Preserve the original upload filename (with extension) so the
    # download endpoint can serve "report.pdf" even when the human-
    # readable ``name`` field is set to "Q3 Sales Report" without an
    # extension. We also keep the resolved MIME type to avoid sniffing
    # by extension on every download — sniffing fails on resources
    # named "test" with no dot, and was the root cause of admins
    # downloading files with no extension and ``application/octet-stream``
    # ending up unviewable on macOS / Windows.
    original_filename = fields.Char(
        string='Original filename',
        help='Filename as uploaded, including extension. Used by the '
             'download endpoint to produce a sensible Content-Disposition.',
    )
    mimetype = fields.Char(
        string='MIME type',
        help='Cached MIME type from the uploaded file or URL. Drives '
             'preview decisions (PDF in iframe vs <img> vs <video>).',
    )
    url = fields.Char()
    difficulty = fields.Selection([
        ('beginner', 'Beginner'), ('intermediate', 'Intermediate'), ('advanced', 'Advanced'),
    ])
    duration_minutes = fields.Integer()
    active = fields.Boolean(default=True)
    creator_id = fields.Many2one('res.users', default=lambda self: self.env.user)

    cefr_level = fields.Selection([
        ('pre_a1', 'Pre-A1'), ('a1', 'A1'), ('a2', 'A2'),
        ('b1', 'B1'), ('b2', 'B2'), ('c1', 'C1'), ('c2', 'C2'),
    ])
    grammar_topic = fields.Char(size=200)
    vocab_band = fields.Char(size=50)
    ai_generated = fields.Boolean(default=False)
    approved = fields.Boolean(default=False)
    ielts_certified = fields.Boolean(default=False)

    def _get_course_count(self):
        Mat = self.env.get('encoach.chapter.material')
        if Mat is None:
            for rec in self:
                rec.course_count = 0
            return
        Mat = self.env['encoach.chapter.material'].sudo()
        for rec in self:
            mats = Mat.search([('resource_id', '=', rec.id)])
            rec.course_count = len(set(
                m.chapter_id.course_id.id for m in mats
                if m.chapter_id and m.chapter_id.course_id
            ))

    course_count = fields.Integer(compute='_get_course_count')

    def to_api_dict(self):
        self.ensure_one()
        creator = self.creator_id
        # Both URLs are JWT-protected via the resources controller; the
        # frontend appends ``?token=…`` with the existing
        # ``withAuthQuery`` helper so they can be used as ``href``,
        # ``src`` of <iframe>/<img>, or download anchors.
        download_url = (
            f'/api/resources/{self.id}/download' if self.file else ''
        )
        preview_url = (
            f'/api/resources/{self.id}/download?inline=1' if self.file else ''
        )
        return {
            'id': self.id,
            'name': self.name,
            'type': self.type or '',
            'resource_type': self.type or 'document',
            'subject_id': self.subject_id.id if self.subject_id else None,
            'subject_name': self.subject_id.name if self.subject_id else '',
            'domain_id': self.domain_id.id if self.domain_id else None,
            'domain_name': self.domain_id.name if self.domain_id else '',
            'topic_ids': self.topic_ids.ids,
            'topic_names': self.topic_ids.mapped('name'),
            'learning_objective_ids': self.learning_objective_ids.ids,
            'learning_objective_names': self.learning_objective_ids.mapped('name'),
            'url': self.url or '',
            'has_file': bool(self.file),
            'mimetype': self.mimetype or '',
            'original_filename': self.original_filename or '',
            'download_url': download_url,
            'preview_url': preview_url,
            'difficulty': self.difficulty or '',
            'duration_minutes': self.duration_minutes,
            'author_id': creator.id if creator else None,
            'author_name': creator.name if creator else '',
            'is_published': bool(self.active),
            'review_status': self.review_status or 'approved',
            'cefr_level': self.cefr_level or '',
            'grammar_topic': self.grammar_topic or '',
            'vocab_band': self.vocab_band or '',
            'tag_ids': self.tag_ids.ids,
            'tag_names': self.tag_ids.mapped('name'),
            'tags': [{'id': t.id, 'name': t.name, 'color': t.color or '#6b7280'} for t in self.tag_ids],
            'ai_generated': self.ai_generated,
            'approved': self.approved,
            'course_count': self.course_count,
            'created_at': self.create_date.isoformat() if self.create_date else '',
            'file_name': self.original_filename or self.name,
        }
