from config import UI_ONBOARDING_CALL_CONTENT_ID
from config import UI_ONBOARDING_CALL_PROGRAM_SEQ_ID
from datetime import timedelta
from dostadmin import db, app_logger
from dostadmin import db_model
from dostadmin.services.scheduling.call_attempt_service import CallAttemptService
from dostadmin.services.scheduling.pre_calculated_campaign_service import (
    PreCalculatedCampaignService,
)
from utils.helpers import helpers


call_attempt_service = CallAttemptService()
pre_calculated_campaign_service = PreCalculatedCampaignService()


class IntroCallSchedulingService:
    def get_intro_call_content(self):
        return UI_ONBOARDING_CALL_CONTENT_ID

    def get_intro_call_programseq_id(self):
        return UI_ONBOARDING_CALL_PROGRAM_SEQ_ID

    def create_intro_call(
        self,
        experience,
        pre_calculated_campaign_data,
        content_id,
        programseq_id,
        scheduled_by,
    ):
        try:
            language_id = experience.language_id
            content_version = db_model.content_version.ContentVersion.query.get_content_version_by_content_and_language_id(
                content_id, language_id
            )
            app_logger.info(
                "Creating intro call campaign for user with phone %s", experience.phone
            )
            campaign = db_model.Campaign(
                name="W0D0_" + str(experience.user_id),
                content_id=content_id,
                content_version_id=content_version.id,
                user_number=experience.phone,
                deploy_datetime=helpers.get_current_isttime() + timedelta(seconds=2),
                status=db_model.Campaign.Status.SCHEDULED,
                experience_id=experience.id,
                scheduled_by=scheduled_by,
                user_id=experience.user_id,
                provider_number=experience.provider_number,
                programseq_id=programseq_id,
                timecategory_id=experience.timecategory_id,
            )
            db.session.add(campaign)
            db.session.commit()

            pre_calculated_campaign_data.call_details_for_date = (
                helpers.get_current_isttime().date()
            )
            pre_calculated_campaign_data.previous_missed_call_campaign_id = campaign.id
            pre_calculated_campaign_data.previous_missed_call_campaign_status = (
                campaign.status
            )
            pre_calculated_campaign_data.today_content_id = campaign.content_id
            pre_calculated_campaign_data.previous_content_id = campaign.content_id
            pre_calculated_campaign_data.today_content_version_id = (
                campaign.content_version_id
            )
            pre_calculated_campaign_data.previous_content_version_id = (
                campaign.content_version_id
            )
            pre_calculated_campaign_data.previous_campaign_name = campaign.name
            pre_calculated_campaign_data.previous_missed_call_deploy_time = (
                campaign.deploy_datetime
            )

            campaign_data = {
                "campaign_id": campaign.id,
                "campaign_name": campaign.name,
                "experience_id": campaign.experience_id,
                "deploy_datetime": campaign.deploy_datetime,
                "content_id": campaign.content_id,
                "content_version_id": campaign.content_version_id,
                "scheduled_by": campaign.scheduled_by,
            }
            pre_calculated_campaign_service.update_pre_calculated_user_campaign_data(
                campaign_data
            )

            return campaign
        except Exception as e:
            app_logger.error(f"Error intro call: {e}")

    def create_and_schedule_intro_campaign(
        self, new_experience, pre_calculated_campaign_data
    ):
        try:
            intro_call_content_id = self.get_intro_call_content()
            intro_call_programseq_id = self.get_intro_call_programseq_id()

            campaign = self.create_intro_call(
                new_experience,
                pre_calculated_campaign_data,
                intro_call_content_id,
                intro_call_programseq_id,
                db_model.Campaign.ScheduledBy.UI_MANUAL,
            )

            if not campaign:
                app_logger.error(
                    f"Intro Call Scheduling Service: Intro call not created for phone number {new_experience.phone}"
                )
                return new_experience, None

            call_attempt_service.attempt_call(
                new_experience, campaign, pre_calculated_campaign_data, True
            )

            return new_experience, campaign.id
        except Exception as e:
            app_logger.error(
                f"Intro Call Scheduling Service: Error while creating and scheduling intro campaign: {e}"
            )
