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__)


class ActivitiesController(http.Controller):

    @http.route('/api/activities', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_activities(self, **kw):
        try:
            M = request.env['op.activity'].sudo()
            offset, limit, page = _paginate(kw)
            total = M.search_count([])
            recs = M.search([], offset=offset, limit=limit, order='id desc')
            items = [{
                'id': r.id,
                'student_id': r.student_id.id if r.student_id else 0,
                'student_name': r.student_id.partner_id.name if r.student_id and r.student_id.partner_id else '',
                'type_id': r.type_id.id if r.type_id else 0,
                'type_name': r.type_id.name if r.type_id else '',
                'date': str(r.date) if hasattr(r, 'date') and r.date else '',
                'description': getattr(r, 'description', '') or '',
            } 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/activities', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_activity(self, **kw):
        try:
            body = _get_json_body()
            vals = {}
            if body.get('student_id'):
                vals['student_id'] = int(body['student_id'])
            if body.get('type_id'):
                vals['type_id'] = int(body['type_id'])
            if body.get('date'):
                vals['date'] = body['date']
            if body.get('description'):
                vals['description'] = body['description']
            rec = request.env['op.activity'].sudo().create(vals)
            return _json_response({'id': rec.id})
        except Exception as e:
            return _error_response(str(e), 500)

    @http.route('/api/activities/<int:aid>', type='http', auth='public', methods=['PATCH', 'PUT'], csrf=False)
    @jwt_required
    def update_activity(self, aid, **kw):
        try:
            rec = request.env['op.activity'].sudo().browse(aid)
            if not rec.exists():
                return _error_response('Not found', 404)
            body = _get_json_body()
            vals = {}
            if 'description' in body:
                vals['description'] = body['description']
            if 'date' in body:
                vals['date'] = body['date']
            if vals:
                rec.write(vals)
            return _json_response({'id': rec.id})
        except Exception as e:
            return _error_response(str(e), 500)

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

    # ── Activity Types ───────────────────────────────────────────────

    @http.route('/api/activity-types', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_types(self, **kw):
        try:
            M = request.env['op.activity.type'].sudo()
            offset, limit, page = _paginate(kw)
            total = M.search_count([])
            recs = M.search([], offset=offset, limit=limit, order='id desc')
            items = [{'id': r.id, 'name': r.name or ''} 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/activity-types', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_type(self, **kw):
        try:
            body = _get_json_body()
            rec = request.env['op.activity.type'].sudo().create({'name': body.get('name', '')})
            return _json_response({'id': rec.id, 'name': rec.name})
        except Exception as e:
            return _error_response(str(e), 500)

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