from __future__ import annotations

from datetime import date, datetime, timedelta
from typing import Any

from .milestones import WbsMilestonesMixin
from .phase_early import WbsPhaseEarlyMixin
from .phase_late import WbsPhaseLateMixin
from .schedule_parser import WbsScheduleParserMixin


class WbsTimelineGeneratorMixin(
    WbsScheduleParserMixin,
    WbsPhaseEarlyMixin,
    WbsPhaseLateMixin,
    WbsMilestonesMixin,
):
    """Master timeline and WBS decomposition pipeline."""

    def generate_timeline_and_wbs(
        self,
        project_name: str,
        project_type: str = "Dân dụng & Hạ tầng",
        contract_value: float = 0,
        start_date: str | date | None = None,
        duration_days: int = 180,
        contract_schedule_text: str | None = None,
    ) -> dict[str, Any]:
        """Tự động phân tích biểu giá hợp đồng và lập kế hoạch thi công / WBS chi tiết."""
        if isinstance(start_date, str):
            try:
                base_start = datetime.strptime(start_date, "%Y-%m-%d").date()
            except Exception:
                base_start = date.today()
        elif isinstance(start_date, date):
            base_start = start_date
        else:
            base_start = date.today()

        total_days = max(int(duration_days or 180), 30)
        contract_val = float(contract_value or 0)

        raw_items = self._parse_contract_schedule_text(contract_schedule_text)

        p1_days = max(int(total_days * 0.10), 10)
        p1_start = base_start
        p1_end = p1_start + timedelta(days=p1_days)

        p2_days = max(int(total_days * 0.30), 20)
        p2_start = p1_end
        p2_end = p2_start + timedelta(days=p2_days)

        p3_days = max(int(total_days * 0.45), 30)
        p3_start = p2_end
        p3_end = p3_start + timedelta(days=p3_days)

        p4_days = max(total_days - (p1_days + p2_days + p3_days), 15)
        p4_start = p3_end
        p4_end = p4_start + timedelta(days=p4_days)

        p1_amount = round(contract_val * 0.05, 2)
        p2_amount = round(contract_val * 0.35, 2)
        p3_amount = round(contract_val * 0.45, 2)
        p4_amount = round(contract_val * 0.15, 2)

        wbs_items: list[dict[str, Any]] = []
        wbs_items.extend(
            self._build_phase_1_items(
                base_start, p1_start, p1_end, p1_days, p1_amount, raw_items
            )
        )
        wbs_items.extend(
            self._build_phase_2_items(p2_start, p2_end, p2_days, p2_amount)
        )
        wbs_items.extend(
            self._build_phase_3_items(p3_start, p3_end, p3_days, p3_amount)
        )
        wbs_items.extend(
            self._build_phase_4_items(p4_start, p4_end, p4_days, p4_amount)
        )

        milestones = self._build_milestones(
            p1_end, p2_end, p3_start, p3_end, p3_days, p4_end
        )

        ai_analysis_notes = (
            f"🤖 Nhân viên AI Phúc (Tiến độ) & Thảo (BoQ) đã phân tích kế hoạch: "
            f"Dự án '{project_name}' được phân rã thành 4 giai đoạn với {len(wbs_items)} hạng mục WBS "
            f"trên tổng thời gian {total_days} ngày. Đường găng CPM tập trung vào Giai đoạn 2 (Móng) "
            f"và Giai đoạn 3 (Kết cấu thân). Đề xuất chỉ huy trưởng bám sát mốc đổ bê tông để tránh chậm trễ."
        )

        return {
            "project_name": project_name,
            "project_type": project_type,
            "contract_value": contract_val,
            "total_duration_days": total_days,
            "start_date": base_start.isoformat(),
            "expected_end_date": p4_end.isoformat(),
            "wbs_items": wbs_items,
            "milestones": milestones,
            "ai_analysis_notes": ai_analysis_notes,
            "generated_by_agent": "phuc",
        }
