import logging
from odoo import http
from odoo.http import request
from odoo.addons.encoach_api.controllers.base import (
    jwt_required, _json_response, _error_response, _get_json_body, _paginate,
)

_logger = logging.getLogger(__name__)


def _ser_lesson(r):
    return {
        'id': r.id,
        'name': r.name or '',
        'lesson_topic': r.lesson_topic or '',
        'subject_id': r.subject_id.id if r.subject_id else 0,
        'subject_name': r.subject_id.name if r.subject_id else '',
        'session_id': r.session_id.id if r.session_id else 0,
        'session_name': r.session_id.display_name if r.session_id else '',
        'course_id': r.course_id.id if r.course_id else 0,
        'batch_id': r.batch_id.id if r.batch_id else 0,
        'faculty_id': r.faculty_id.id if r.faculty_id else 0,
        'start_datetime': str(r.start_datetime) if r.start_datetime else '',
        'end_datetime': str(r.end_datetime) if r.end_datetime else '',
        'status': r.status or 'draft',
    }


class LessonsController(http.Controller):

    @http.route('/api/lessons', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_lessons(self, **kw):
        try:
            M = request.env['encoach.lesson'].sudo()
            offset, limit, page = _paginate(kw)
            total = M.search_count([])
            recs = M.search([], offset=offset, limit=limit, order='start_datetime desc, id desc')
            items = [_ser_lesson(r) for r in recs]
            return _json_response({'items': items, 'data': items, 'total': total, 'page': page, 'size': limit})
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/lessons', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_lesson(self, **kw):
        try:
            body = _get_json_body()
            vals = {}
            if body.get('name'):
                vals['name'] = body['name']
            if body.get('lesson_topic'):
                vals['lesson_topic'] = body['lesson_topic']
            for fk in ('course_id', 'batch_id', 'subject_id', 'session_id', 'faculty_id'):
                if body.get(fk):
                    vals[fk] = int(body[fk])
            for dt in ('start_datetime', 'end_datetime'):
                if body.get(dt):
                    vals[dt] = body[dt]
            rec = request.env['encoach.lesson'].sudo().create(vals)
            return _json_response(_ser_lesson(rec))
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/lessons/<int:lid>', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def get_lesson(self, lid, **kw):
        try:
            rec = request.env['encoach.lesson'].sudo().browse(lid)
            if not rec.exists():
                return _error_response('Not found', 404)
            return _json_response(_ser_lesson(rec))
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/lessons/<int:lid>', type='http', auth='public', methods=['PATCH', 'PUT'], csrf=False)
    @jwt_required
    def update_lesson(self, lid, **kw):
        try:
            rec = request.env['encoach.lesson'].sudo().browse(lid)
            if not rec.exists():
                return _error_response('Not found', 404)
            body = _get_json_body()
            vals = {}
            for k in ('name', 'lesson_topic', 'start_datetime', 'end_datetime', 'status'):
                if k in body:
                    vals[k] = body[k]
            for fk in ('course_id', 'batch_id', 'subject_id', 'session_id', 'faculty_id'):
                if fk in body:
                    vals[fk] = int(body[fk]) if body[fk] else False
            if vals:
                rec.write(vals)
            return _json_response(_ser_lesson(rec))
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/lessons/<int:lid>', type='http', auth='public', methods=['DELETE'], csrf=False)
    @jwt_required
    def delete_lesson(self, lid, **kw):
        try:
            rec = request.env['encoach.lesson'].sudo().browse(lid)
            if rec.exists():
                rec.unlink()
            return _json_response({'success': True})
        except Exception as e:
            return _error_response(str(e), 500)
