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 FacilitiesController(http.Controller):

    @http.route('/api/facilities', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_facilities(self, **kw):
        try:
            M = request.env['op.facility'].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 '',
                'code': getattr(r, 'code', '') 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/facilities', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_facility(self, **kw):
        try:
            body = _get_json_body()
            vals = {'name': body.get('name', '')}
            if body.get('code'):
                vals['code'] = body['code']
            rec = request.env['op.facility'].sudo().create(vals)
            return _json_response({'id': rec.id, 'name': rec.name, 'code': getattr(rec, 'code', '')})
        except Exception as e:
            return _error_response(str(e), 500)

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

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

    # ── Assets ───────────────────────────────────────────────────────

    # Assets are tracked via encoach.asset (lightweight custom model since
    # OpenEduCat has no dedicated asset model in this build).

    def _asset_model(self):
        return request.env['encoach.asset'].sudo()

    @http.route('/api/assets', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_assets(self, **kw):
        try:
            M = self._asset_model()
            offset, limit, page = _paginate(kw)
            domain = []
            if kw.get('facility_id'):
                try:
                    domain.append(('facility_id', '=', int(kw['facility_id'])))
                except Exception:
                    pass
            total = M.search_count(domain)
            recs = M.search(domain, offset=offset, limit=limit, order='id desc')
            items = [{
                'id': r.id,
                'name': r.name or '',
                'code': r.code or '',
                'facility_id': r.facility_id.id if r.facility_id else 0,
                'facility_name': r.facility_id.name if r.facility_id else '',
                'description': r.description or '',
            } for r in recs]
            return _json_response({'items': items, 'data': items, 'total': total, 'page': page, 'size': limit})
        except Exception as e:
            _logger.exception('list_assets')
            return _error_response(str(e), 500)

    @http.route('/api/assets', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_asset(self, **kw):
        try:
            body = _get_json_body()
            name = (body.get('name') or '').strip()
            if not name:
                return _error_response('Name is required', 400)
            vals = {'name': name}
            if body.get('code'):
                vals['code'] = body['code']
            if body.get('facility_id'):
                vals['facility_id'] = int(body['facility_id'])
            if body.get('description'):
                vals['description'] = body['description']
            rec = self._asset_model().create(vals)
            return _json_response({
                'id': rec.id, 'name': rec.name, 'code': rec.code or '',
                'facility_id': rec.facility_id.id if rec.facility_id else 0,
            })
        except Exception as e:
            _logger.exception('create_asset')
            return _error_response(str(e), 500)

    @http.route('/api/assets/<int:aid>', type='http', auth='public', methods=['PATCH', 'PUT'], csrf=False)
    @jwt_required
    def update_asset(self, aid, **kw):
        try:
            rec = self._asset_model().browse(aid)
            if not rec.exists():
                return _error_response('Not found', 404)
            body = _get_json_body()
            vals = {}
            for k in ('name', 'code', 'description'):
                if k in body:
                    vals[k] = body[k]
            if 'facility_id' in body:
                vals['facility_id'] = int(body['facility_id']) if body['facility_id'] else False
            if vals:
                rec.write(vals)
            return _json_response({'id': rec.id, 'name': rec.name})
        except Exception as e:
            return _error_response(str(e), 500)

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