using Brizco.Common.Models.Exception;

namespace Brizco.Domain.Entities.Tasks;


public partial class Task
{

    public static Task Create(
        string title,
        string description,
        TaskType type,
        bool isDisposable,
        DateTime setFor,
        bool hasDisposed,
        int amount,
        PurchaseAmountType amountType,
        Guid complexId,
        TaskScheduleType scheduleType)
    {
        if (scheduleType == TaskScheduleType.Custom && setFor == DateTime.MinValue)
            throw new AppException("اگر تکرار وظیفه یک روز خاص باشد باید ان روز را انتخاب کنید");
        if (scheduleType == TaskScheduleType.Custom)
            isDisposable = true;
        return new Task(
            type,
            isDisposable,
            setFor,
            hasDisposed,
            amount,
            amountType,
            title,
            description,
            complexId,
            scheduleType);
    }


    public TaskDay SetDay(DayOfWeek dayOfWeek)
    {
        var taskDay = new TaskDay(dayOfWeek, Id);
        Days.Add(taskDay);
        return taskDay;
    }


    public void AddShift(params Guid[] shiftIds)
    {
        foreach (var shiftId in shiftIds)
        {
            var plan = new TaskShift(Id, shiftId);
            Shifts.Add(plan);
        }
    }

    public TaskShift AddShift(Guid shiftId)
    {
        var plan = new TaskShift(Id, shiftId);
        Shifts.Add(plan);
        return plan;
    }

    public void AddPosition(params Guid[] positionIds)
    {
        foreach (var positionId in positionIds)
        {
            var position = new TaskPosition(positionId, Id);
            Positions.Add(position);
        }
    }
    public TaskPosition AddPosition(Guid positionId)
    {
        var position = new TaskPosition(positionId, Id);
        Positions.Add(position);
        return position;
    }



    public void AddRoutine(params Guid[] routineIds)
    {
        foreach (var routineId in routineIds)
        {
            var routine = new TaskRoutine(routineId, Id);
            Routines.Add(routine);
        }
    }
    public TaskRoutine AddRoutine(Guid routineId)
    {
        var routine = new TaskRoutine(routineId, Id);
        Routines.Add(routine);
        return routine;
    }
}

public partial class Activity
{

    public static Activity Create(
        ActivityStatus status,
        DateTime doneAt,
        string performanceDescription,
        string title,
        string description,
        TaskType type,
        bool isDisposable,
        DateTime setFor,
        bool hasDisposed,
        int amount,
        PurchaseAmountType amountType,
        Guid complexId,
        TaskScheduleType scheduleType)
    {
        return new Activity(
            status,
            doneAt,
            performanceDescription,
            type,
            isDisposable,
            setFor,
            hasDisposed,
            amount,
            amountType,
            title,
            description,
            complexId,
            scheduleType);
    }

    public void SetShiftPlan(Guid shiftPlanId)
    {
        this.ShiftPlanId = shiftPlanId;
    }


    public void SetUser(Guid userId)
    {
        this.UserId = userId;
    }

    public void DoneActivity()
    {
        DoneAt = DateTime.UtcNow;
        IsDone = true;
        Status = ActivityStatus.Done;
    }

    public void CompleteActivity(bool isDone, string performanceDescription)
    {
        if (!isDone)
            Status = ActivityStatus.UnDone;
        else
            Status = ActivityStatus.Complete;
        IsDone = isDone;
        PerformanceDescription = performanceDescription;
    }

    public void UnDoneActivity(string undoneReason)
    {
        IsDone = false;
        UnDoneReason = undoneReason;
        Status = ActivityStatus.UnDone;
    }
}