"""
月次レポート生成サービス - データ集計ロジック
"""
import os
import sys
from datetime import datetime
from calendar import monthrange

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from config import ESTIMATED_HANDLE_TIME_MINUTES, HOURLY_COST
from core.database import (
    get_statistics_for_period,
    get_monthly_comparison,
    get_daily_statistics,
    get_hourly_statistics,
    get_day_of_week_statistics,
    get_hour_by_day_of_week,
    get_average_turns,
    get_unresolved_by_hour,
    get_keywords,
    get_unresolved_keywords,
    get_unanswered_questions,
    get_recent_disliked,
    get_feedback_daily_stats,
    get_qa_usage_ranking,
    get_category_usage_ranking,
)


class ReportDataAggregator:
    """月次レポートに必要なデータを収集・集計するクラス"""

    def __init__(self, year: int, month: int):
        self.year = year
        self.month = month
        self.start_date, self.end_date = self._get_month_range()

    def _get_month_range(self):
        """対象月の開始日と終了日を取得"""
        _, last_day = monthrange(self.year, self.month)
        start = f"{self.year}-{self.month:02d}-01"
        end = f"{self.year}-{self.month:02d}-{last_day:02d}"
        return start, end

    def collect_all_data(self) -> dict:
        """全データを収集して辞書で返す"""
        summary = self._get_summary()
        comparison = get_monthly_comparison(self.year, self.month)

        return {
            'period': {
                'year': self.year,
                'month': self.month,
                'start_date': self.start_date,
                'end_date': self.end_date,
            },
            'summary': summary,
            'comparison': comparison,
            'daily_stats': get_daily_statistics(self.start_date, self.end_date),
            'hourly_stats': get_hourly_statistics(self.start_date, self.end_date),
            'day_of_week_stats': get_day_of_week_statistics(self.start_date, self.end_date),
            'hour_by_day_of_week': get_hour_by_day_of_week(self.start_date, self.end_date),
            'avg_turns': get_average_turns(self.start_date, self.end_date),
            'unresolved_by_hour': get_unresolved_by_hour(self.start_date, self.end_date),
            'keywords': get_keywords(self.start_date, self.end_date),
            'unresolved_keywords': get_unresolved_keywords(self.start_date, self.end_date),
            'unanswered_questions': get_unanswered_questions(self.start_date, self.end_date),
            'recent_disliked': get_recent_disliked(self.start_date, self.end_date),
            'feedback_daily_stats': get_feedback_daily_stats(self.start_date, self.end_date),
            'qa_usage_ranking': get_qa_usage_ranking(self.start_date, self.end_date),
            'category_usage_ranking': get_category_usage_ranking(self.start_date, self.end_date),
            'estimated_savings': self._calculate_savings(summary),
        }

    def _get_summary(self) -> dict:
        """サマリー統計を計算"""
        stats = get_statistics_for_period(self.start_date, self.end_date)

        total = stats['total_conversations']
        answered = stats['answered_count']
        unanswered = stats['unanswered_count']
        likes = stats['likes_count']
        dislikes = stats['dislikes_count']
        total_feedbacks = stats['total_feedbacks']
        unique_ips = stats['unique_ips']

        # 自動解決率
        resolution_rate = round(answered / total * 100, 1) if total > 0 else 0
        # 未解決率
        unresolved_rate = round(unanswered / total * 100, 1) if total > 0 else 0
        # 満足度（いいね / 総フィードバック）
        satisfaction_rate = round(likes / total_feedbacks * 100, 1) if total_feedbacks > 0 else 0
        # フィードバック率
        feedback_rate = round(total_feedbacks / total * 100, 1) if total > 0 else 0
        # ユーザーあたり平均会話数
        conversations_per_user = round(total / unique_ips, 1) if unique_ips > 0 else 0

        return {
            **stats,
            'resolution_rate': resolution_rate,
            'unresolved_rate': unresolved_rate,
            'satisfaction_rate': satisfaction_rate,
            'feedback_rate': feedback_rate,
            'conversations_per_user': conversations_per_user,
        }

    def _calculate_savings(self, summary: dict) -> dict:
        """推定削減時間・コストを計算"""
        answered = summary['answered_count']

        # 推定削減時間（分）
        saved_minutes = answered * ESTIMATED_HANDLE_TIME_MINUTES
        # 時間に変換
        saved_hours = saved_minutes / 60
        # 推定削減コスト
        saved_cost = saved_hours * HOURLY_COST

        return {
            'answered_count': answered,
            'estimated_handle_time_minutes': ESTIMATED_HANDLE_TIME_MINUTES,
            'hourly_cost': HOURLY_COST,
            'saved_minutes': saved_minutes,
            'saved_hours': round(saved_hours, 1),
            'saved_cost': int(saved_cost),
        }
