from flask import request
from flask_restx import Resource, reqparse, abort, Namespace,Model
from app.services.schedule_service import ScheduleService
# from app.schema.schedule import schedule_dict
from flask_restx import fields
from app.services.channel_service import ChannelService
from app.services.program_service import ProgramService

# Create a namespace for schedules
schedule_namespace = Namespace('schedules', path='/schedules')

schedule_model = Model('Schedule', {
    'channel': fields.String(required=True),
    'program': fields.String(required=True),
    'date': fields.String(default="2023-10-02", description='Date of the program schedule (in ISO format)'),
    'start_time': fields.String(default="10:05", description='Start time of the program (in ISO format)'),
    'end_time': fields.String(default="10:50", description='End time of the program (in ISO format)'),
})


@schedule_namespace.route('/<string:schedule_id>')
class ScheduleResource(Resource):
    

    def get(self, schedule_id):
        self.service = ScheduleService()
        schedule = self.service.get_schedule_by_id(schedule_id).to_dict()
        if not schedule:
            return abort(404, message="Schedule not found")
        return schedule

    @schedule_namespace.expect(schedule_model)
    def put(self, schedule_id):
        self.service = ScheduleService()
        parser = reqparse.RequestParser()
        parser.add_argument("channel", type=str, required=True)
        parser.add_argument("program", type=str, required=True)
        parser.add_argument("date", type=str, required=True)
        parser.add_argument("start_time", type=str, required=True)
        parser.add_argument("end_time", type=str, required=True)

        data = parser.parse_args()
        updated_schedule = self.service.update_schedule(schedule_id, data)
        if not updated_schedule:
            return abort(404, message="Schedule not found")
        return updated_schedule

    def delete(self, schedule_id):
        self.service = ScheduleService()
        if self.service.delete_schedule(schedule_id):
            return {"message": "Schedule deleted"}, 204
        return abort(404, message="Schedule not found")

@schedule_namespace.route('/')
class ScheduleListResource(Resource):
    
    def get(self):
        self.service = ScheduleService()
        schedules = self.service.get_all_schedules()
        return schedules

    @schedule_namespace.expect(schedule_model)
    def post(self):
        self.service = ScheduleService()
        parser = reqparse.RequestParser()
        parser.add_argument("channel", type=str, required=True)
        parser.add_argument("program", type=str, required=True)
        parser.add_argument("date", type=str, required=True)
        parser.add_argument("start_time", type=str, required=True)
        parser.add_argument("end_time", type=str, required=True)
        data = parser.parse_args()
        
        channel = ChannelService.get_channel_by_id(data['channel'])
        program = ProgramService.get_program_by_id(data['program'])
        if not channel:
            return {"error":"Channel Not Found"},404

        if not program:
            return {"error":"Program Not Found"},404
        new_schedule = self.service.create_schedule(data)
        return new_schedule, 201

    def delete(self):
        self.service = ScheduleService()
        deleted_count = self.service.delete_all_schedules()
        if deleted_count > 0:
            return {"message": f"{deleted_count} schedules deleted"}, 204
        return abort(404, message="No schedules found")
