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

_logger = logging.getLogger(__name__)


def _ser_session(s):
    timing = s.timing_id if hasattr(s, 'timing_id') and s.timing_id else None
    return {
        'id': s.id,
        'course_id': s.course_id.id if hasattr(s, 'course_id') and s.course_id else 0,
        'course_name': s.course_id.name if hasattr(s, 'course_id') and s.course_id else '',
        'teacher_name': s.faculty_id.partner_id.name if hasattr(s, 'faculty_id') and s.faculty_id and s.faculty_id.partner_id else '',
        'batch_name': s.batch_id.name if hasattr(s, 'batch_id') and s.batch_id else '',
        'day': getattr(s, 'day', '') or '',
        'start_time': str(timing.hour) + ':' + str(int(timing.minute)).zfill(2) if timing and hasattr(timing, 'hour') else getattr(s, 'start_datetime', '') or '',
        'end_time': '',
        'room': getattr(s, 'classroom_id', False) and s.classroom_id.name or '',
    }


class TimetableController(http.Controller):

    @http.route('/api/timetable', type='http', auth='public', methods=['GET'], csrf=False)
    @jwt_required
    def list_timetable(self, **kw):
        try:
            M = request.env['op.session'].sudo()
            domain = []
            if kw.get('course_id'):
                domain.append(('course_id', '=', int(kw['course_id'])))
            if kw.get('batch_id'):
                domain.append(('batch_id', '=', int(kw['batch_id'])))
            recs = M.search(domain, limit=200, order='id desc')
            data = [_ser_session(r) for r in recs]
            return _json_response({'data': data})
        except Exception as e:
            _logger.exception('list_timetable')
            return _error_response(str(e), 500)

    @http.route('/api/timetable', type='http', auth='public', methods=['POST'], csrf=False)
    @jwt_required
    def create_timetable(self, **kw):
        try:
            body = _get_json_body()
            vals = {}
            if body.get('course_id'):
                vals['course_id'] = int(body['course_id'])
            if body.get('batch_id'):
                vals['batch_id'] = int(body['batch_id'])
            if body.get('faculty_id'):
                vals['faculty_id'] = int(body['faculty_id'])
            if body.get('subject_id'):
                vals['subject_id'] = int(body['subject_id'])
            if body.get('day'):
                vals['day'] = body['day']
            rec = request.env['op.session'].sudo().create(vals)
            return _json_response(_ser_session(rec))
        except Exception as e:
            return _error_response(str(e), 500)

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