<?php
/**
 * REST API Endpoints Controller
 * Exposes /wp-json/proto-preview/v1/ for AJAX and player frontend
 */

class Proto_Preview_REST {

    protected $db;
    protected $namespace = 'proto-preview/v1';

    public function __construct(Proto_Preview_DB $db) {
        $this->db = $db;
    }

    public function init() {
        add_action('rest_api_init', [$this, 'register_routes']);
    }

    public function register_routes() {
        // 1. Projects
        register_rest_route($this->namespace, '/projects', [
            [
                'methods' => WP_REST_Server::READABLE,
                'callback' => [$this, 'get_projects'],
                'permission_callback' => '__return_true'
            ],
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'create_project'],
                'permission_callback' => '__return_true'
            ]
        ]);

        register_rest_route($this->namespace, '/projects/(?P<id>\d+)', [
            [
                'methods' => WP_REST_Server::READABLE,
                'callback' => [$this, 'get_project'],
                'permission_callback' => '__return_true'
            ],
            [
                'methods' => WP_REST_Server::DELETABLE,
                'callback' => [$this, 'delete_project'],
                'permission_callback' => '__return_true'
            ]
        ]);

        // 2. Pages / Screens
        register_rest_route($this->namespace, '/pages', [
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'create_page'],
                'permission_callback' => '__return_true'
            ]
        ]);

        register_rest_route($this->namespace, '/pages/(?P<id>\d+)', [
            [
                'methods' => WP_REST_Server::DELETABLE,
                'callback' => [$this, 'delete_page'],
                'permission_callback' => '__return_true'
            ]
        ]);

        // 3. Layouts / Variations
        register_rest_route($this->namespace, '/layouts', [
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'create_layout'],
                'permission_callback' => '__return_true'
            ]
        ]);

        register_rest_route($this->namespace, '/layouts/choose', [
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'choose_variation'],
                'permission_callback' => '__return_true'
            ]
        ]);

        register_rest_route($this->namespace, '/layouts/(?P<id>\d+)', [
            [
                'methods' => WP_REST_Server::DELETABLE,
                'callback' => [$this, 'delete_layout'],
                'permission_callback' => '__return_true'
            ]
        ]);

        // 4. Comments
        register_rest_route($this->namespace, '/comments', [
            [
                'methods' => WP_REST_Server::READABLE,
                'callback' => [$this, 'get_comments'],
                'permission_callback' => '__return_true'
            ],
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'create_comment'],
                'permission_callback' => '__return_true'
            ]
        ]);

        register_rest_route($this->namespace, '/comments/resolve', [
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'resolve_comment'],
                'permission_callback' => '__return_true'
            ]
        ]);

        // 5. Approvals
        register_rest_route($this->namespace, '/approvals', [
            [
                'methods' => WP_REST_Server::READABLE,
                'callback' => [$this, 'get_approvals'],
                'permission_callback' => '__return_true'
            ],
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'save_approval'],
                'permission_callback' => '__return_true'
            ]
        ]);

        // 6. Users / Stakeholder Sessions
        register_rest_route($this->namespace, '/users', [
            [
                'methods' => WP_REST_Server::READABLE,
                'callback' => [$this, 'get_users'],
                'permission_callback' => '__return_true'
            ]
        ]);

        register_rest_route($this->namespace, '/switch-user', [
            [
                'methods' => WP_REST_Server::CREATABLE,
                'callback' => [$this, 'switch_user'],
                'permission_callback' => '__return_true'
            ]
        ]);
    }

    public function get_projects(WP_REST_Request $request) {
        $projects = $this->db->get_projects();
        return rest_ensure_response($projects);
    }

    public function get_project(WP_REST_Request $request) {
        $id = (int)$request->get_param('id');
        $project = $this->db->get_projects($id);
        if (!$project) {
            return new WP_Error('not_found', 'Project not found', ['status' => 404]);
        }
        return rest_ensure_response($project);
    }

    public function create_project(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $name = sanitize_text_field($params['name'] ?? '');
        $client_name = sanitize_text_field($params['client_name'] ?? '');
        $desc = sanitize_textarea_field($params['description'] ?? '');

        if (empty($name)) {
            return new WP_Error('invalid_param', 'Project name is required', ['status' => 400]);
        }

        $user_id = get_current_user_id() ?: 1;
        $project = $this->db->create_project($name, $client_name, $desc, $user_id);
        return rest_ensure_response($project);
    }

    public function delete_project(WP_REST_Request $request) {
        $id = (int)$request->get_param('id');
        $this->db->delete_project($id);
        return rest_ensure_response(['deleted' => true, 'id' => $id]);
    }

    public function create_page(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $project_id = (int)($params['project_id'] ?? 0);
        $name = sanitize_text_field($params['name'] ?? '');
        $slug = sanitize_text_field($params['slug'] ?? '');

        if ($project_id <= 0 || empty($name)) {
            return new WP_Error('invalid_param', 'project_id and name are required', ['status' => 400]);
        }

        $page = $this->db->create_page($project_id, $name, $slug);
        return rest_ensure_response($page);
    }

    public function delete_page(WP_REST_Request $request) {
        $id = (int)$request->get_param('id');
        $this->db->delete_page($id);
        return rest_ensure_response(['deleted' => true, 'id' => $id]);
    }

    public function create_layout(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $project_id = (int)($params['project_id'] ?? 0);
        $page_id = (int)($params['page_id'] ?? 1);
        $name = sanitize_text_field($params['name'] ?? '');
        $badge = sanitize_text_field($params['badge'] ?? 'New Option');
        $file_path = esc_url_raw($params['file_path'] ?? PROTO_PREVIEW_PLUGIN_URL . 'layouts/saas-v1.html');

        if (empty($name)) {
            return new WP_Error('invalid_param', 'Variation name is required', ['status' => 400]);
        }

        $layout = $this->db->create_layout($project_id, $page_id, $name, $file_path, $badge);
        return rest_ensure_response($layout);
    }

    public function choose_variation(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $layout_id = (int)($params['layout_id'] ?? 0);
        if ($layout_id <= 0) {
            return new WP_Error('invalid_param', 'layout_id is required', ['status' => 400]);
        }

        $user_id = get_current_user_id() ?: 1;
        $updated = $this->db->choose_variation($layout_id, $user_id);
        return rest_ensure_response($updated);
    }

    public function delete_layout(WP_REST_Request $request) {
        $id = (int)$request->get_param('id');
        $this->db->delete_layout($id);
        return rest_ensure_response(['deleted' => true, 'id' => $id]);
    }

    public function get_comments(WP_REST_Request $request) {
        $layout_id = (int)$request->get_param('layout_id');
        $comments = $this->db->get_comments($layout_id);
        return rest_ensure_response($comments);
    }

    public function create_comment(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $layout_id = (int)($params['layout_id'] ?? 0);
        $x = (float)($params['x_percent'] ?? 0);
        $y = (float)($params['y_percent'] ?? 0);
        $text = sanitize_textarea_field($params['text'] ?? '');
        $user_id = get_current_user_id() ?: 1;

        if ($layout_id <= 0 || empty($text)) {
            return new WP_Error('invalid_param', 'layout_id and text required', ['status' => 400]);
        }

        $comment = $this->db->create_comment($layout_id, $user_id, $x, $y, $text);
        return rest_ensure_response($comment);
    }

    public function resolve_comment(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $comment_id = (int)($params['comment_id'] ?? 0);
        $res = $this->db->toggle_resolve_comment($comment_id);
        return rest_ensure_response($res);
    }

    public function get_approvals(WP_REST_Request $request) {
        $layout_id = (int)$request->get_param('layout_id');
        $user_id = get_current_user_id() ?: 1;
        $data = $this->db->get_approvals($layout_id, $user_id);
        return rest_ensure_response($data);
    }

    public function save_approval(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $layout_id = (int)($params['layout_id'] ?? 0);
        $step_order = (int)($params['step_order'] ?? 1);
        $selector = sanitize_text_field($params['target_selector'] ?? '');
        $status = sanitize_text_field($params['status'] ?? 'approved');
        $note = sanitize_textarea_field($params['note'] ?? '');
        $user_id = get_current_user_id() ?: 1;

        $res = $this->db->save_approval($layout_id, $user_id, $step_order, $selector, $status, $note);
        return rest_ensure_response($res);
    }

    public function get_users(WP_REST_Request $request) {
        $wp_users = get_users(['number' => 20]);
        $users = [];
        foreach ($wp_users as $u) {
            $is_admin = user_can($u->ID, 'manage_options');
            $users[] = [
                'id' => $u->ID,
                'name' => $u->display_name,
                'email' => $u->user_email,
                'role' => $is_admin ? 'designer' : 'client',
                'company' => $is_admin ? 'Bowden Works (Design Lead)' : 'Client Reviewer',
                'avatar' => get_avatar_url($u->ID)
            ];
        }

        // Add demo Sarah Jenkins & Marcus Vance if not in DB
        if (count($users) <= 1) {
            $users[] = [
                'id' => 2,
                'name' => 'Sarah Jenkins',
                'email' => 'sarah@nexusfintech.io',
                'role' => 'client',
                'company' => 'Nexus Financial Inc. (Client Stakeholder)',
                'avatar' => 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&auto=format&fit=crop&q=80'
            ];
            $users[] = [
                'id' => 3,
                'name' => 'Marcus Vance',
                'email' => 'marcus@nexusfintech.io',
                'role' => 'client',
                'company' => 'Nexus Financial Inc. (VP Product)',
                'avatar' => 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&auto=format&fit=crop&q=80'
            ];
        }

        return rest_ensure_response($users);
    }

    public function switch_user(WP_REST_Request $request) {
        $params = $request->get_json_params() ?: $request->get_params();
        $user_id = (int)($params['user_id'] ?? 1);
        $user = get_user_by('id', $user_id);
        if ($user) {
            wp_set_current_user($user_id);
            wp_set_auth_cookie($user_id);
        }
        return rest_ensure_response([
            'id' => $user_id,
            'name' => $user ? $user->display_name : 'Stakeholder User',
            'role' => ($user && user_can($user->ID, 'manage_options')) ? 'designer' : 'client',
            'avatar' => get_avatar_url($user_id)
        ]);
    }
}
