middleware('auth')->except(['publicTeamReport', 'exportTeamReport']); $this->_service = 'formreminders'; $this->_module = 'milestones'; $this->_viewname = 'milestone'; $this->_title = 'Milestone View'; $this->_base_url = '/milestone'; } public function list(Request $request) { $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module . '/get_all'); // echo '
'; print_r($response); exit;


        $fields = $this->get_list_fields();
        return $this->view('list')->with([
            'title' => $this->_title,
            'fields' => $fields,
            'base_url' => $this->_base_url,
            'items' => $response->data->items,
            'buttons' => $this->get_list_buttons()
        ]);
    }

    protected function get_list_fields()
    {
        return [
            'actions' => ['title' => 'Actions', 'buttons' => ['edit', 'delete']],
            'title' => ['title' => 'Name', 'type' => 'text'],
            'status' => ['title' => 'Status', 'type' => 'select'],
        ];
    }

    protected function get_list_buttons()
    {
        return [
            ['title' => 'Add New', 'link' => $this->_base_url . '/addnew'],
        ];
    }

    protected function get_form_fields($type, $values)
    {
        $metrics = $this->getlambda('get', 'metric', 'metric', 'get_all');
        $metrics_dd = [];
        foreach ($metrics->data->items as $metric) {
            $metrics_dd[$metric->id] = $metric->name;
        }

        $badge = $this->getlambda('get', 'recognition', 'badge_list', 'get_all');
        $badge_dd = [];
        foreach ($badge->data->items as $bd) {
            $badge_dd[$bd->id] = $bd->title;
        }

        $apprcat = $this->getlambda('get', 'recognition', 'appreciation_category', 'get_all');
        $apprcat_dd = [];
        foreach ($apprcat->data->items as $bd) {
            $apprcat_dd[$bd->id] = $bd->title;
        }
        // echo '
'; print_r($apprcat_dd); exit;

        // $domain = LambdaRequest::signedrequest('get', 'ums', 'domain/get_one');
        // //echo '
'; print_r($domain); exit;
        // $designations_dd = [];
        // foreach($domain->data->item->designations as $designation){
        //     $designations_dd[$designation] = $designation;
        // }
        //echo '
'; print_r($values); exit;

        $roles = $this->getlambda('get', 'ums', 'roles', 'dropdown');
        $roles_dd = [];
        foreach ($roles->data->items as $role) {
            $roles_dd[$role->id] = $role->name;
        }

        $coattr = $this->getlambda('get', 'contact', 'contactattribute', 'get_all');
        $coattr_dd = [];
        foreach ($coattr->data->items as $coatt) {
            $coattr_dd[$coatt->code] = $coatt->attribute;
        }

        $apprimg = $this->getlambda('get', 'recognition', 'appreciation_image', 'get_all');
        $apprimg_dd = [];
        foreach ($apprimg->data->items as $appr) {
            $apprimg_dd[$appr->id] = [
                'title' => $appr->title,
                'image' => $appr->image
            ];
        }
        // echo '
'; print_r($apprimg_dd); exit;

        //echo '
'; print_r($coattr_dd); exit;

        $userattr_dd = $this->getUserAttributeOptions();

        $dates_dd = ['L' => 'Last day of month'];
        $date = 1;
        while($date <= 31) {
            $dates_dd[$date] = $date;
            $date++;
        }

        $fields = [
            'title' => ['title' => 'Title', 'type' => 'text', 'required' => true],
            'interval_start_date' => ['title' => 'Interval Start Date', 'type' => 'date', 'required' => true],
            'interval_end_date' => ['title' => 'Interval End Date', 'type' => 'date', 'required' => true],
            // 'is_recurring' => ['title' => 'Is Recurring', 'type' => 'select', 'required' => true, 'values' => ['Yes' => 'Yes', 'No' => 'No']],
            'period' => ['title' => 'Period', 'type' => 'select', 'required' => true, 'values' => ['daily' => 'Daily', 'weekly' => 'Weekly', 'monthly'=>  'Monthly', 'yearly' => 'Yearly', 'overall' => 'Overall', 'custom' => 'Custom'] ],
            'custom_start_date' => ['title' => 'Custom Start Date', 'type' => 'date', 'required' => false],
            'custom_end_date' => ['title' => 'Custom End Date', 'type' => 'date', 'required' => false],
            'status' => ['title' => 'Status', 'type' => 'select', 'required' => true, 'values' => ['active' => 'Active', 'disabled' => 'Disabled']],
            'show_positions' => ['title' => 'Show Positions', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'show_positions_type' => ['title' => 'Show Positions Type', 'type' => 'select', 'required' => true, 'values' => ['all' => 'All', 'loggedin' => 'Logged In']],
            'show_units_export' => ['title' => 'Show Units Export', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No'], 'default' => 'yes'],
            'show_user_attributes' => ['title' => 'Show User Attributes', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No'], 'default' => 'no'],
            'user_attributes' => ['title' => 'Include User Attributes', 'type' => 'multiselect', 'values' => $userattr_dd, 'default' => []],
            'show_normal_metrics' => ['title' => 'Show Normal Metrics', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No'], 'default' => 'yes'],
            'show_combined_metrics' => ['title' => 'Show Combined Metrics', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No'], 'default' => 'yes'],
            'manager_details' => ['title' => 'Manager Details', 'type' => 'multiselect', 'values' => ['l1manager' => 'L1 Manager', 'l2manager' => 'L2 Manager', 'l3manager' => 'L3 Manager', 'l4manager' => 'L4 Manager'], 'default' => ['l1manager']],
            'total_units_name' => ['title' => 'Total Units Name', 'type' => 'text', 'required' => false, 'default' => ''],
            'send_report' => ['title' => 'Send Report', 'type' => 'select', 'required' => true, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'performance_period' => ['title' => 'Performance Period', 'type' => 'select', 'required' => false, 'values' => ['daily' => 'Daily', 'weekly' => 'Weekly', 'monthly' => 'Monthly']],
            'days_or_dates' => ['title' => 'Days or Dates', 'type' => 'radio', 'required' => false, 'fullwidth' => true, 'values' => ['days' => 'Days', 'dates' => 'Dates']],
            'days' => ['title' => 'Days', 'type' => 'checkbox', 'required' => false, 'fullwidth' => true, 'values' => ['MON' => 'Monday', 'TUE' => 'Tuesday', 'WED' => 'Wednesday', 'THU' => 'Thursday', 'FRI' => 'Friday', 'SAT' => 'Saturday', 'SUN' => 'Sunday']],
            'dates' => ['title' => 'Dates', 'type' => 'multiselect', 'required' => false, 'values' => $dates_dd],
            'send_time' => ['title' => 'Send Time', 'type' => 'text', 'required' => false],
            'send_report_roles' => ['title' => 'Send Report Roles', 'type' => 'multiselect', 'required' => false, 'values' => $roles_dd],
            'report_roles' => ['title' => 'Report Roles', 'type' => 'multiselect', 'required' => false, 'values' => $roles_dd],
            'send_user_performance' => ['title' => 'Send User Performance', 'type' => 'select', 'required' => false, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'ai_action_items' => ['title' => 'AI Action Items', 'type' => 'select', 'required' => false, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'send_pending_users' => ['title' => 'Send Pending Users', 'type' => 'select', 'required' => false, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'show_target_average' => ['title' => 'Show Target Average', 'type' => 'select', 'required' => false, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'show_overall_average' => ['title' => 'Show Overall Average', 'type' => 'select', 'required' => false, 'values' => ['yes' => 'Yes', 'no' => 'No']],
            'subject' => ['title' => 'Report Subject', 'type' => 'text', 'required' => false],
            'body' => ['title' => 'Report Body', 'type' => 'textarea', 'required' => false],

        ];

        $fields['metrics'] = ['title' => 'Metric Mapping', 'type' => 'mapping', 'required' => true, 'metrics' => $metrics_dd, 'types' => ['unit' => 'Units', 'count' => 'Count'], 'fullwidth' => true];

        $fields['milestones'] = ['title' => 'Milestone', 'type' => 'milestonemapping', 'required' => true, 'roles' => $roles_dd, 'badges' => $badge_dd, 'appreciation_categories' => $apprcat_dd, 'appreciation_image' => $apprimg_dd, 'types' => ['unit' => 'Units', 'count' => 'Count'], 'fullwidth' => true];

        // $fields = array_merge(
        //     $fields,
        //     [
        //         'operation' => ['title' => 'Operation', 'type' => 'select', 'required' => true, 'values' => ['sum' => 'Sum', 'avg' => 'Avg', 'value_count' => 'Count']],
        //         'agg_type' => ['title' => 'Aggregation Type', 'type' => 'select', 'required' => true, 'values' => ['individual' => 'Individual', 'team' => 'Team']],

        //         'graphical_views' => ['title' => 'Graphical views', 'type' => 'multiselect', 'values' => ['progress' => 'Progress', 'percentile' => 'Percentile', 'pie' => 'Pie chart', 'bar' => 'Bar chart', 'line' => 'Line chart']],
        //         'details_views' => ['title' => 'Details views', 'type' => 'multiselect', 'required' => true, 'values' => ['tabular' => 'Tabular', 'contacts' => 'Doctor View', 'incremental' => 'Incremental View']],
        //         'trend_views' => ['title' => 'Trend views', 'type' => 'multiselect', 'values' => ['bar' => 'Bar chart', 'line' => 'Line chart', 'tabular' => 'Tabular']],
        //         'leaderboard_views' => ['title' => 'Leaderboard views', 'type' => 'multiselect', 'values' => ['leaderboard' => 'Leaderboard View']],
        //         'contacts_views' => ['title' => 'Doctor views', 'type' => 'multiselect', 'values' => ['contacts' => 'Doctor View']],
        //         'doctor_view_name' => ['title' => 'Enter Doctor View Name', 'type' => 'text', 'required' => false],

        //         'intervals' => ['title' => 'Intervals', 'type' => 'multiselect', 'required' => true, 'values' => ['yearlycy' => 'Calender Year', 'yearlyfy' => 'Financial Year', 'monthly' => 'Monthly', 'weekly' => 'Weekly', 'daily' => 'Daily']],

        //         'default_interval' => ['title' => 'Default Interval', 'type' => 'select', 'required' => true, 'values' => ['month-0' => 'This Month', 'month-1' => 'Last Month', 'month-3' => 'Last 3 Months', 'month-6' => 'Last 6 Months', 'month-12' => 'Last 12 Months', 'day-0' => 'Today', 'day-1' => 'Yesterday', 'day-7' => 'Last 7 Days', 'day-30' => 'Last 30 Days', 'week-0' => 'This week', 'week-1' => 'Last week', 'week-2' => '-2 week', 'week-3' => '-3 week', 'week-4' => '-4 week', 'yearfy-0' => 'This Financial Year', 'yearfy-1' => 'Last Financial Year', 'yearcy-0' => 'This Calender Year', 'yearcy-1' => 'Last Calender Year']],
        //         'widget_sort_order' => ['title' => 'Widget Sort Order', 'type' => 'number', 'required' => true],
        //         'doctor_type' => ['title' => 'Doctor Type', 'type' => 'text', 'required' => false],
        //         'combined_metrics' => ['title' => 'Combined Metrics (if any)', 'type' => 'combined_metrics', 'fullwidth' => true],

        //         'report_roles' => ['title' => 'Data Report from Roles', 'type' => 'multiselect', 'values' => $roles_dd, 'required' => true],

        //         'status' => ['title' => 'Status', 'type' => 'select', 'required' => true, 'values' => ['active' => 'Active', 'disabled' => 'Disabled']],
        //         'show_positions' => ['title' => 'Show Position in Reports', 'type' => 'select', 'required' => true, 'values' => ['Yes' => 'Yes', 'No' => 'No']],

        //         'contact_attributes' => ['title' => 'Include Doctor Attributes', 'type' => 'multiselect', 'values' => $coattr_dd],
        //     ]
        // );

        return $fields;
    }

    protected function _beforesave($type, $request)
    {
        $data = $request->except('_token');
        //  echo '
';
        // print_r($data);
        // exit;
        $milestones = [];
        $count = count($data['target'] ?? []);

        $start = Carbon::createFromFormat('m/d/Y', $data['interval_start_date'])->format('Y-m-d');
        $end   = Carbon::createFromFormat('m/d/Y', $data['interval_end_date'])->format('Y-m-d');

        // if (!empty($data['custom_start_date'])) {
        //     $data['custom_start_date'] = Carbon::createFromFormat('m/d/Y', $data['custom_start_date'])->format('Y-m-d');
        // }

        // if (!empty($data['custom_end_date'])) {
        //     $data['custom_end_date'] = Carbon::createFromFormat('m/d/Y', $data['custom_end_date'])->format('Y-m-d');
        // }

            $data['custom_start_date'] = !empty($data['custom_start_date'])
    ? Carbon::createFromFormat('m/d/Y', $data['custom_start_date'])->format('Y-m-d')
    : '';

$data['custom_end_date'] = !empty($data['custom_end_date'])
    ? Carbon::createFromFormat('m/d/Y', $data['custom_end_date'])->format('Y-m-d')
    : '';


        $data['interval'] = $start . '_' . $end;

        for ($i = 0; $i < $count; $i++) {

            $milestones[] = [

                "milestone_id" => $data['milestone_id'][$i] ?? Str::uuid()->toString(),

                "target" => [
                    "value" => (int) ($data['target'][$i] ?? 0),
                    "target_title" => $data['target_title'][$i] ?? '',
                ],

                "repeat_target" => ($data['repeat_target'][$i] ?? '0') === '1',

                "roles" => $data['roles'][$i] ?? [],

                "reporting_roles" => $data['reporting_roles'][$i] ?? [],

                "actions" => [

                    "user_notification" => isset($data['user_notification'][$i]),

                    "user_email" => isset($data['user_email'][$i]),

                    "manager_notification" => $data['manager_notification'][$i] ?? [],

                    "manager_email" => $data['manager_email'][$i] ?? [],

                    "send_badge" => array_values(array_filter((array)($data['send_badge'][$i] ?? []))),

                    "send_appreciation" => [
                        [
                            "category_id" => $data['appreciation_category'][$i] ?? null,
                            "image_id" => $data['appreciation_image'][$i] ?? null,
                            "message" => $data['appreciation_message'][$i] ?? null
                        ]
                    ]

                ]

            ];
        }

        $data['milestones'] = $milestones;
        unset($data['milestone_id'], $data['target'], $data['target_title'], $data['repeat_target'], $data['roles'], $data['reporting_roles'], $data['user_notification'], $data['user_email'], $data['manager_notification'], $data['manager_email'], $data['send_badge'], $data['appreciation_category'], $data['appreciation_image'], $data['appreciation_message']);

        // echo "
";
        // print_r($data);
        // exit;



        $data['metrics'] = [];

        foreach ($data['metric'] ?? [] as $k => $metric) {
            $target = $data['metric_target'][$k] ?? '';
            $data['metrics'][] = [
                'metric' => $metric,
                'display' => $data['display_unit'][$k] ?? '',
                'weight' => isset($data['weight'][$k]) && $data['weight'][$k] !== '' ? (string) $data['weight'][$k] : '1',
                'target' => $target !== '' && $target !== null ? (string) $target : '',
            ];
        }

        $daysOrDates = $data['days_or_dates'] ?? 'days';
        $data['send_report'] = $this->toBool($data['send_report'] ?? 'no');
        $data['report_config'] = [
            'days_or_dates' => $daysOrDates,
            'days' => $daysOrDates === 'days' ? $this->toStringList($data['days'] ?? []) : [],
            'dates' => $daysOrDates === 'dates' ? $this->toStringList($data['dates'] ?? []) : [],
            'send_time' => $data['send_time'] ?? '13:00',
            'performance_period' => $data['performance_period'] ?? 'monthly',
            'send_report_roles' => $this->toStringList($data['send_report_roles'] ?? []),
            'report_roles' => $this->toStringList($data['report_roles'] ?? []),
            'send_user_performance' => $this->toBool($data['send_user_performance'] ?? 'no'),
            'ai_action_items' => $this->toBool($data['ai_action_items'] ?? 'no'),
            'send_pending_users' => $this->toBool($data['send_pending_users'] ?? 'no'),
            'show_target_average' => $this->toBool($data['show_target_average'] ?? 'no'),
            'show_overall_average' => $this->toBool($data['show_overall_average'] ?? 'no'),
            'subject' => trim((string) ($data['subject'] ?? '')),
            'body' => trim((string) ($data['body'] ?? '')),
        ];

        // $data['is_recurring'] = isset($data['is_recurring']) ? (strtolower($data['is_recurring']) === 'yes') : false;

        if (!isset($data['manager_details']) || !is_array($data['manager_details']) || $data['manager_details'] === []) {
            $data['manager_details'] = ['l1manager'];
        }
        foreach (['show_units_export', 'show_normal_metrics', 'show_combined_metrics'] as $flag) {
            if (!isset($data[$flag]) || $data[$flag] === '') {
                $data[$flag] = 'yes';
            }
        }
        $data['show_user_attributes'] = ($data['show_user_attributes'] ?? 'no') === 'yes' ? 'yes' : 'no';
        $data['user_attributes'] = $this->normalizeAttributeCodes($data['user_attributes'] ?? []);
        $data['total_units_name'] = trim((string) ($data['total_units_name'] ?? ''));

        unset($data['interval_start_date']);
        unset($data['interval_end_date']);
        unset($data['metric']);
        unset($data['display_unit']);
        unset($data['weight']);
        unset($data['metric_target']);
        unset(
            $data['days_or_dates'],
            $data['days'],
            $data['dates'],
            $data['send_time'],
            $data['performance_period'],
            $data['send_report_roles'],
            $data['report_roles'],
            $data['send_user_performance'],
            $data['ai_action_items'],
            $data['send_pending_users'],
            $data['show_target_average'],
            $data['show_overall_average'],
            $data['subject'],
            $data['body']
        );
        // echo '
';
        // print_r($data);
        // exit;
        return $data;
    }

    protected function _beforeform($type, $values)
    {
        if ($type == 'edit') {
            if (!isset($values->manager_details) || !is_array($values->manager_details) || $values->manager_details === []) {
                $values->manager_details = ['l1manager'];
            }
            foreach (['show_units_export', 'show_normal_metrics', 'show_combined_metrics'] as $flag) {
                if (!isset($values->{$flag}) || $values->{$flag} === '') {
                    $values->{$flag} = 'yes';
                }
            }
            $values->show_user_attributes = (($values->show_user_attributes ?? 'no') === 'yes') ? 'yes' : 'no';
            $values->user_attributes = $this->normalizeAttributeCodes($values->user_attributes ?? []);
            if (!isset($values->total_units_name) || $values->total_units_name === null) {
                $values->total_units_name = '';
            }

            // split interval
            if (!empty($values->interval)) {
                [$start, $end] = explode('_', $values->interval);

                $values->interval_start_date = date('m/d/Y', strtotime($start));
                $values->interval_end_date   = date('m/d/Y', strtotime($end));
            }

            // boolean
            // $values->is_recurring = isset($values->is_recurring) ? (strtolower($values->is_recurring) === 'yes') : false;
          

            // $values->is_recurring = isset($values->is_recurring)
            // ? (
            //     (is_string($values->is_recurring) && strtolower($values->is_recurring) === 'yes') 
            //     || $values->is_recurring === 1 
            //     || $values->is_recurring === true
            // )
            //     ? 'Yes' 
            //     : 'No'
            // : '';

            // prepare milestone arrays for blade
            $values->target = [];
            $values->target_title = [];
            $values->repeat_target = [];
            $values->roles = [];
            $values->reporting_roles = [];
            $values->user_notification = [];
            $values->user_email = [];
            $values->manager_notification = [];
            $values->manager_email = [];
            $values->send_badge = [];
            $values->appreciation_category = [];
            $values->appreciation_image = [];
            $values->appreciation_message = [];
            $values->milestone_id = [];

            if (!empty($values->milestones)) {

                foreach ($values->milestones as $i => $milestone) {

                    $values->milestone_id[$i] = $milestone->milestone_id ?? null;

                    if (is_object($milestone->target ?? null)) {
                        $values->target[$i] = $milestone->target->value ?? 0;
                        $values->target_title[$i] = $milestone->target->target_title ?? '';
                    } else {
                        $values->target[$i] = $milestone->target ?? 0;
                        $values->target_title[$i] = '';
                    }

                    $values->repeat_target[$i] = !empty($milestone->repeat_target) ? '1' : '0';

                    $values->roles[$i] = $milestone->roles ?? [];

                    $values->reporting_roles[$i] = $milestone->reporting_roles ?? [];

                    $values->user_notification[$i] =
                        !empty($milestone->actions->user_notification)
                        ? $milestone->actions->user_notification
                        : [];

                    $values->user_email[$i] =
                        !empty($milestone->actions->user_email)
                        ? $milestone->actions->user_email
                        : [];

                    $values->manager_notification[$i] =
                        $milestone->actions->manager_notification ?? [];

                    $values->manager_email[$i] =
                        $milestone->actions->manager_email ?? [];

                    $values->send_badge[$i] =
                        $milestone->actions->send_badge ?? [];

                    $app = $milestone->actions->send_appreciation[0] ?? null;

                    $values->appreciation_category[$i] = $app->category_id ?? null;
                    $values->appreciation_image[$i] = $app->image_id ?? null;
                    $values->appreciation_message[$i] = $app->message ?? null;
                }
            }

            // metrics conversion
            if (!empty($values->metrics)) {

                $values->metric = [];
                $values->display_unit = [];
                $values->sort_order = [];
                $values->list_view = [];
                $values->weight = [];
                $values->metric_target = [];

                foreach ($values->metrics as $k => $metric) {
                    $metric = is_object($metric) ? $metric : (object) $metric;
                    $values->metric[$k] = $metric->metric ?? '';
                    $values->display_unit[$k] = $metric->display ?? '';
                    $values->weight[$k] = $metric->weight ?? 1;
                    $values->metric_target[$k] = $metric->target ?? '';
                }
            }

            $reportConfig = $values->report_config ?? null;
            if (is_array($reportConfig)) {
                $reportConfig = (object) $reportConfig;
            }
            if (is_object($reportConfig)) {
                $values->days_or_dates = $reportConfig->days_or_dates ?? 'days';
                $values->days = $this->toStringList($reportConfig->days ?? []);
                $values->dates = $this->toStringList($reportConfig->dates ?? []);
                $values->send_time = $reportConfig->send_time ?? '';
                $values->performance_period = $reportConfig->performance_period ?? '';
                $values->send_report_roles = $this->toStringList($reportConfig->send_report_roles ?? []);
                $values->report_roles = $this->toStringList($reportConfig->report_roles ?? []);
                $values->send_user_performance = $this->fromBool($reportConfig->send_user_performance ?? false);
                $values->ai_action_items = $this->fromBool($reportConfig->ai_action_items ?? false);
                $values->send_pending_users = $this->fromBool($reportConfig->send_pending_users ?? false);
                $values->show_target_average = $this->fromBool($reportConfig->show_target_average ?? false);
                $values->show_overall_average = $this->fromBool($reportConfig->show_overall_average ?? false);
                $values->subject = $reportConfig->subject ?? '';
                $values->body = $reportConfig->body ?? '';
            } else {
                $values->days_or_dates = 'days';
                $values->days = [];
                $values->dates = [];
                $values->send_time = '';
                $values->performance_period = '';
                $values->send_report_roles = [];
                $values->report_roles = [];
                $values->send_user_performance = 'no';
                $values->ai_action_items = 'no';
                $values->send_pending_users = 'no';
                $values->show_target_average = 'no';
                $values->show_overall_average = 'no';
                $values->subject = '';
                $values->body = '';
            }
            $values->send_report = $this->fromBool($values->send_report ?? false);
        }
        // echo '
';
        // print_r($values);
        // exit;
        return $values;
    }

    public function form($type, $id = null)
    {
        $values = [];
        if ($type == 'edit') {
            $response = LambdaRequest::signedrequest('get', $this->_service, $this->_module . '/get_one', ['id' => $id]);
            $values = $response->data->item;
            // echo '
'; print_r($values); exit;
        }
        //echo '
'; print_r($values); exit;
        $data = $this->_beforeform($type, $values);
        $fields = $this->get_form_fields($type, $values);
        // echo '
'; print_r($data); exit;
        return $this->view('form')->with([
            'title' => $this->_title,
            'mode' => $type,
            'fields' => $fields,
            'base_url' => $this->_base_url,
            'item' => $data,
        ]);
    }

    public function dashboardLeaderboards(Request $request)
    {
        $response = LambdaRequest::signedrequest('get', 'reports', 'roles_leaderboard/list', [], 120);
        if (!is_object($response) || ($response->statusCode ?? 0) != 200) {
            return view('widgets.milestone_team_leaderboard_cards', ['items' => []]);
        }

        $leaderboards = $response->data ?? [];
        if (is_object($leaderboards) && isset($leaderboards->items)) {
            $leaderboards = $leaderboards->items;
        }
        if (is_object($leaderboards)) {
            $leaderboards = array_values((array) $leaderboards);
        }
        if (!is_array($leaderboards)) {
            $leaderboards = [];
        }

        $items = [];
        foreach ($leaderboards as $board) {
            $board = $this->asObject($board);
            $rankRoles = $board->rank_roles ?? [];
            if (is_object($rankRoles)) {
                $rankRoles = array_values((array) $rankRoles);
            }
            if (!is_array($rankRoles)) {
                $rankRoles = [];
            }

            $start = $board->validity_start ?? '';
            $end = $board->validity_end ?? '';
            $detailsUrl = url('/leaderboard/dashboard') . '?' . http_build_query([
                'id' => $board->id ?? '',
            ]);

            if ($this->isTeamLeaderboardView($board->team_view ?? false)) {
                $items[] = [
                    'id' => $board->id ?? '',
                    'title' => $board->name ?? 'Leaderboard',
                    'interval_label' => trim($start . ($start && $end ? ' – ' : '') . $end),
                    'details_url' => $detailsUrl,
                    'podium_users' => $this->podiumUsersFromTeams($rankRoles),
                    'pills' => [],
                ];
                continue;
            }

            $pills = [];
            foreach ($rankRoles as $index => $rankRole) {
                $rankRole = $this->asObject($rankRole);
                $role = $this->asObject($rankRole->role ?? null);
                $roleId = $role->id ?? '';
                $limit = (int) ($rankRole->limit ?? 10);
                if ($limit < 1) {
                    $limit = 10;
                }
                $pills[] = [
                    'label' => $this->rankRolePillLabel($rankRole->title ?? '', $limit, $role->name ?? ''),
                    'url' => $detailsUrl . '&' . http_build_query([
                        'role' => $roleId,
                    ]),
                    'podium_users' => $this->podiumUsersFromRankRole($rankRole),
                    'active' => $index === 0,
                ];
            }

            $items[] = [
                'id' => $board->id ?? '',
                'title' => $board->name ?? 'Leaderboard',
                'interval_label' => trim($start . ($start && $end ? ' – ' : '') . $end),
                'details_url' => $pills[0]['url'] ?? $detailsUrl,
                'podium_users' => $pills[0]['podium_users'] ?? [],
                'pills' => $pills,
            ];
        }

        return view('widgets.milestone_team_leaderboard_cards', [
            'items' => $items,
        ]);
    }

    protected function rankRolePillLabel($title, $limit, $roleName): string
    {
        $title = trim((string) $title);
        if ($title === '') {
            $title = trim((string) $roleName) !== '' ? $roleName : 'Role';
        }
        if (preg_match('/^\s*top\s+\d+/i', $title)) {
            return $title;
        }
        return 'Top ' . (int) $limit . ' ' . $title;
    }

    protected function podiumUsersFromRankRole($rankRole): array
    {
        $rows = $rankRole->users ?? [];
        if (is_object($rows)) {
            $rows = array_values((array) $rows);
        }
        if (!is_array($rows)) {
            return [];
        }

        $users = [];
        foreach (array_slice($rows, 0, 3) as $row) {
            $row = $this->asObject($row);
            $info = $this->asObject($row->user ?? null);
            $name = trim((string) ($info->name ?? ''));
            $users[] = [
                'name' => $name,
                'initials' => $this->userInitials($name),
                'avatar' => $info->avatar ?? '',
                'score' => is_numeric($row->score ?? null) ? (0 + $row->score) : 0,
            ];
        }
        return $users;
    }

    protected function isTeamLeaderboardView($flag): bool
    {
        return $flag === true || $flag === 1 || $flag === '1' || $flag === 'true' || $flag === 'yes';
    }

    protected function podiumUsersFromTeams(array $rows): array
    {
        usort($rows, function ($a, $b) {
            $a = $this->asObject($a);
            $b = $this->asObject($b);
            return ((int) ($a->rank ?? 0)) <=> ((int) ($b->rank ?? 0));
        });

        $users = [];
        foreach (array_slice($rows, 0, 3) as $row) {
            $row = $this->asObject($row);
            $team = $this->asObject($row->team ?? null);
            $name = trim((string) ($team->name ?? ''));
            if ($name === '') {
                $name = 'Team';
            }
            $users[] = [
                'name' => $name,
                'initials' => $this->userInitials($name),
                'avatar' => $team->icon ?? '',
                'score' => is_numeric($row->score ?? null) ? (0 + $row->score) : 0,
            ];
        }

        return $users;
    }

    public function dashboardLeaderboardPodium(Request $request)
    {
        $data = $this->teamReportViewData($request);
        if (!empty($data['error'])) {
            return response()->json([
                'status' => 'error',
                'message' => $data['error'],
                'users' => [],
                'groups' => [],
            ]);
        }

        $users = $this->rankedReportUsers($data['report'] ?? null);
        $groups = $this->leaderboardGroups($users);

        $startLabel = $this->formatReportDate($data['start_date'] ?? '');
        $endLabel = $this->formatReportDate($data['end_date'] ?? '');
        $intervalLabel = trim($startLabel . ($startLabel && $endLabel ? ' – ' : '') . $endLabel);

        return response()->json([
            'status' => 'success',
            'title' => $data['title'] ?? 'Leaderboard',
            'interval_label' => $intervalLabel,
            'users' => $users,
            'groups' => $groups,
        ]);
    }

    public function publicTeamReport(Request $request)
    {
        $data = $this->teamReportViewData($request);
        $data['exportUrl'] = url('/milestones/exportTeamReport') . '?' . http_build_query($request->query());
        return view('milestone.public_team_report', $data);
    }

    public function viewTeamReport(Request $request)
    {
        $data = $this->teamReportViewData($request);
        $data['exportUrl'] = url('/milestones/exportTeamReport') . '?' . http_build_query($request->query());
        return view('milestone.team_report', $data);
    }

    public function exportTeamReport(Request $request)
    {
        $data = $this->teamReportViewData($request);
        if (!empty($data['error'])) {
            $fallback = Auth::check() ? '/milestones/viewTeamReport' : '/milestones/publicTeamReport';
            return redirect($fallback . '?' . http_build_query($request->query()))
                ->withError($data['error']);
        }

        $report = $data['report'];
        $users = [];
        if ($report && isset($report->users)) {
            $users = is_array($report->users) ? $report->users : array_values((array) $report->users);
        }

        $metrics = [];
        if (count($users)) {
            $first = is_object($users[0]) ? $users[0] : (object) $users[0];
            if (isset($first->metrics)) {
                $metrics = is_array($first->metrics) ? $first->metrics : array_values((array) $first->metrics);
            }
        }

        $metricHasTarget = [];
        foreach ($metrics as $index => $metricCol) {
            $metricCol = is_object($metricCol) ? $metricCol : (object) $metricCol;
            $hasTarget = false;
            foreach ($users as $user) {
                $cell = $this->teamReportMetricCell($user, $metricCol);
                if ($this->teamReportMetricHasTarget($cell)) {
                    $hasTarget = true;
                    break;
                }
            }
            $metricHasTarget[$index] = $hasTarget;
        }

        $headers = ['Rank', 'User', 'Employee Code', 'Designation', 'Position', 'Score'];
        foreach ($metrics as $index => $metric) {
            $metric = is_object($metric) ? $metric : (object) $metric;
            $name = $metric->name ?? ($metric->metric ?? 'Metric');
            $headers[] = $name . ' Value';
            $headers[] = $name . ' Average';
            if (!empty($metricHasTarget[$index])) {
                $headers[] = $name . ' Target';
                $headers[] = $name . ' Status';
            }
        }

        $exceldata = [$headers];
        foreach ($users as $index => $user) {
            $user = is_object($user) ? $user : (object) $user;
            $row = [
                $index + 1,
                $user->name ?? '',
                $user->employee_code ?? '',
                $user->designation ?? '',
                $user->position_name ?? '',
                $user->score ?? 0,
            ];

            foreach ($metrics as $metricIndex => $metricCol) {
                $metricCol = is_object($metricCol) ? $metricCol : (object) $metricCol;
                $cell = $this->teamReportMetricCell($user, $metricCol);
                if ($cell) {
                    $row[] = $cell->value ?? 0;
                    $row[] = $cell->previous_average ?? 0;
                    if (!empty($metricHasTarget[$metricIndex])) {
                        $row[] = $this->teamReportMetricHasTarget($cell) ? ($cell->target ?? '') : '';
                        $row[] = $this->teamReportMetricHasTarget($cell)
                            ? (!empty($cell->completed) ? 'Completed' : 'Not completed')
                            : '';
                    }
                } else {
                    $row[] = '';
                    $row[] = '';
                    if (!empty($metricHasTarget[$metricIndex])) {
                        $row[] = '';
                        $row[] = '';
                    }
                }
            }

            $exceldata[] = $row;
        }

        $filename = preg_replace('/[^A-Za-z0-9_\-]+/', '-', (string) ($data['title'] ?: 'leaderboard'));
        $filename = trim($filename, '-') ?: 'leaderboard';

        return Excel::download(new InvoicesExport($exceldata), $filename . '-team-report.xlsx');
    }

    public function getTeamReport(Request $request)
    {
        $data = $this->teamReportViewData($request);
        if (!empty($data['error'])) {
            return response('

' . e($data['error']) . '

'); } return view('widgets.milestone_team_leaderboard_table', $data); } protected function teamReportViewData(Request $request): array { $user = Auth::user(); $params = [ 'report_id' => trim((string) $request->query('report_id', '')), 'partition' => trim((string) $request->query('partition', '')), ]; if ($params['partition'] === '' && $user) { $params['partition'] = $this->currentPartition(); } if ($params['report_id'] === '' || $params['partition'] === '') { return [ 'error' => 'Unable to load this leaderboard for the current user.', 'title' => 'Leaderboard', 'performance_period' => '', 'start_date' => '', 'end_date' => '', 'report' => null, ]; } $response = Auth::check() ? LambdaRequest::signedrequest('get', $this->_service, $this->_module . '/getTeamReport', $params, 120) : LambdaRequest::getrequest($this->_service, $this->_module . '/getTeamReport', $params, '', 120); if (!is_object($response) || ($response->statusCode ?? 0) != 200 || !isset($response->data)) { $message = is_object($response) ? ($response->message ?? 'Unable to load leaderboard.') : 'Unable to load leaderboard.'; return [ 'error' => $message, 'title' => 'Leaderboard', 'performance_period' => '', 'start_date' => '', 'end_date' => '', 'report' => null, ]; } $data = $response->data; $reports = $data->reports ?? []; if (is_object($reports)) { $reports = (array) $reports; } return [ 'error' => '', 'title' => $data->title ?? 'Leaderboard', 'performance_period' => $data->performance_period ?? '', 'start_date' => $data->start_date ?? '', 'end_date' => $data->end_date ?? '', 'report' => (is_array($reports) && count($reports)) ? $reports[0] : null, ]; } protected function teamReportMetricCell($user, $metricCol) { $user = is_object($user) ? $user : (object) $user; $metricCol = is_object($metricCol) ? $metricCol : (object) $metricCol; $userMetrics = []; if (isset($user->metrics)) { $userMetrics = is_array($user->metrics) ? $user->metrics : array_values((array) $user->metrics); } foreach ($userMetrics as $userMetric) { $userMetric = is_object($userMetric) ? $userMetric : (object) $userMetric; if (($userMetric->metric ?? '') === ($metricCol->metric ?? '')) { return $userMetric; } } return null; } protected function teamReportMetricHasTarget($cell): bool { if (!$cell) { return false; } $target = $cell->target ?? null; return $target !== null && $target !== '' && (float) $target > 0; } protected function toBool($value): bool { if (is_bool($value)) { return $value; } return in_array(strtolower((string) $value), ['yes', '1', 'true'], true); } protected function fromBool($value): string { return $this->toBool($value) ? 'yes' : 'no'; } protected function toStringList($value): array { if ($value === null || $value === '') { return []; } if (is_object($value)) { $value = (array) $value; } if (!is_array($value)) { return [(string) $value]; } return array_values(array_map('strval', $value)); } protected function currentPartition(): string { $domain = Auth::user()->domain ?? ''; return $domain !== '' ? 'rapport-' . $domain : ''; } protected function currentUserRoleIds(): array { $roles = Auth::user()->roles ?? []; $decoded = is_string($roles) ? json_decode($roles, true) : $roles; if (is_array($decoded)) { return array_values(array_filter(array_map('strval', $decoded))); } return $this->toStringList(is_string($roles) ? explode('#', $roles) : $roles); } protected function asObject($value): object { if (is_object($value)) { return $value; } if (is_array($value)) { return (object) $value; } return (object) []; } protected function intervalLabel($interval): string { if (!is_string($interval) || $interval === '') { return ''; } $parts = explode('_', $interval); if (count($parts) !== 2) { return $interval; } $start = strtotime($parts[0]); $end = strtotime($parts[1]); return ($start ? date('d M Y', $start) : $parts[0]) . ' – ' . ($end ? date('d M Y', $end) : $parts[1]); } protected function milestoneVisibleOnDashboard($milestone, array $userRoles): bool { $status = strtolower((string) ($milestone->status ?? '')); if (!empty($milestone->is_deleted) || in_array($status, ['deleted', 'disabled'], true)) { return false; } if ($status !== '' && $status !== 'active') { return false; } $reportConfig = $this->asObject($milestone->report_config ?? null); $sendRoles = $this->toStringList($reportConfig->send_report_roles ?? []); $reportRoles = $this->toStringList($reportConfig->report_roles ?? []); $hasReport = $this->toBool($milestone->send_report ?? false) || count($reportRoles) > 0; if (!$hasReport) { return false; } $allowed = array_merge($sendRoles, $reportRoles); $rows = $milestone->milestones ?? []; if (is_object($rows)) { $rows = (array) $rows; } foreach ($rows as $row) { $row = $this->asObject($row); $allowed = array_merge( $allowed, $this->toStringList($row->roles ?? []), $this->toStringList($row->reporting_roles ?? []) ); } $allowed = array_values(array_unique(array_filter($allowed))); if (!count($allowed)) { return true; } return count(array_intersect($userRoles, $allowed)) > 0; } protected function rankedReportUsers($report): array { $users = []; if ($report && isset($report->users)) { $users = is_array($report->users) ? $report->users : array_values((array) $report->users); } $ranked = []; foreach ($users as $index => $user) { $user = is_object($user) ? $user : (object) $user; $name = trim((string) ($user->name ?? '')); $ranked[] = [ 'rank' => $index + 1, 'name' => $name, 'initials' => $this->userInitials($name), 'avatar' => $user->avatar ?? '', 'score' => is_numeric($user->score ?? null) ? (0 + $user->score) : 0, 'designation' => trim((string) ($user->designation ?? '')), 'position_name' => trim((string) ($user->position_name ?? '')), ]; } return $ranked; } protected function leaderboardGroups(array $users): array { $grouped = []; foreach ($users as $user) { $key = $user['designation'] !== '' ? $user['designation'] : 'Team'; if (!isset($grouped[$key])) { $grouped[$key] = 0; } $grouped[$key]++; } $groups = []; foreach ($grouped as $key => $count) { $labelName = $key; if ($count !== 1 && !preg_match('/s$/i', $labelName)) { $labelName .= 's'; } $groups[] = [ 'key' => $key, 'label' => 'Top ' . $count . ' ' . $labelName, 'count' => $count, ]; } usort($groups, function ($a, $b) { return $b['count'] <=> $a['count']; }); return $groups; } protected function userInitials($name): string { $parts = preg_split('/\s+/', trim((string) $name)); $parts = array_values(array_filter($parts)); if (!count($parts)) { return '?'; } if (count($parts) === 1) { return strtoupper(substr($parts[0], 0, 2)); } return strtoupper(substr($parts[0], 0, 1) . substr($parts[count($parts) - 1], 0, 1)); } protected function formatReportDate($value): string { if ($value === null || $value === '') { return ''; } if (is_numeric($value)) { return date('d M Y', (int) $value); } $ts = strtotime((string) $value); return $ts ? date('d M Y', $ts) : ''; } protected function getUserAttributeOptions(): array { $options = []; $userAttrs = $this->getlambda('get', 'ums', 'userattribute', 'get_all'); foreach (($userAttrs->data->items ?? []) as $attr) { if (($attr->status ?? 'active') === 'disabled') { continue; } $code = $attr->code ?? ''; if ($code === '') { continue; } $options[$code] = $attr->attribute ?? $code; } return $options; } protected function normalizeAttributeCodes($raw): array { if (is_string($raw) && $raw !== '') { $decoded = json_decode($raw, true); $raw = is_array($decoded) ? $decoded : explode('#', $raw); } if (!is_array($raw)) { return []; } $codes = []; foreach ($raw as $code) { if (is_object($code)) { $code = $code->code ?? ''; } $code = trim((string) $code); if ($code !== '') { $codes[] = $code; } } return array_values(array_unique($codes)); } }