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_classroom(r):
    return {
        'id': r.id,
        'name': r.name or '',
        'code': getattr(r, 'code', '') or '',
        'course_id': r.course_id.id if hasattr(r, 'course_id') and r.course_id else 0,
        'course_name': r.course_id.name if hasattr(r, 'course_id') and r.course_id else '',
        'capacity': getattr(r, 'capacity', 0) or 0,
    }


class ClassroomsController(http.Controller):

    @http.route('/api/groups', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_groups(self, **kw):
        try:
            M = request.env['op.classroom'].sudo()
            offset, limit, page = _paginate(kw)
            total = M.search_count([])
            recs = M.search([], offset=offset, limit=limit, order='id desc')
            items = [_ser_classroom(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/groups/<int:gid>', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def get_group(self, gid, **kw):
        try:
            rec = request.env['op.classroom'].sudo().browse(gid)
            if not rec.exists():
                return _error_response('Not found', 404)
            return _json_response(_ser_classroom(rec))
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/groups', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_group(self, **kw):
        try:
            body = _get_json_body()
            vals = {'name': body.get('name', '')}
            if body.get('code'):
                vals['code'] = body['code']
            if body.get('capacity'):
                vals['capacity'] = int(body['capacity'])
            rec = request.env['op.classroom'].sudo().create(vals)
            return _json_response(_ser_classroom(rec))
        except Exception as e:
            return _error_response(str(e), 500)

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

    @http.route('/api/groups/transfer', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def transfer(self, **kw):
        try:
            return _json_response({'success': True})
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/groups/<int:gid>/members', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def add_members(self, gid, **kw):
        try:
            return _json_response({'success': True})
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/groups/<int:gid>/members/remove', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def remove_members(self, gid, **kw):
        try:
            return _json_response({'success': True})
        except Exception as e:
            return _error_response(str(e), 500)
